一文带你深入了解Java8 Stream流式编程

一文带你深入了解Java8 Stream流式编程

什么是Java 8 Stream

Java 8中引入了Stream API,通过Stream API,处理集合数据更加简单,更加高效。Stream API就如同一个迭代器(Iterator)一样,单向处理数据流并生成处理结果。

Stream接口可以让我们完成下面的任务:

  • 集合类型,比如 List,Set,甚至 Map 等等都可以做为 Stream 的数据源。
  • 数据处理操作,包括 filter,map,reduce,find,match ,排序等等。
  • 处理结果可以是 Stream类型,也可以是其他集合类型,比如 List,Set 或 Map等。

最基本使用

下面是一个最基本的Stream使用例子:

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
list.add("date");
list.add("grape");

list.stream()
    .filter(e -> e.startsWith("a"))
    .map(String::toUpperCase)
    .forEach(System.out::println); // 输出:APPLE

在这个例子中,我们创建了一个String类型的List,通过stream()方法获取数据流,使用filter()方法对数据流进行过滤,使用map()方法对过滤后的结果进行转换,使用forEach()方法进行输出。

中间操作

通常,Stream操作会分成两种:中间操作和最终操作。中间操作会返回一个新的Stream类型对象,所以支持链式调用,常用的中间操作有:

filter

filter方法可以用一个谓词来过滤出所有符合谓词的元素,比如下面这个例子:

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> evenNumbers = numbers.filter(n -> n % 2 == 0);
evenNumbers.forEach(System.out::println); // 输出:2 4 6 8 10

map

map方法可以用一个函数转换流中的每个元素,比如下面这个例子:

Stream<String> stream = Stream.of("java", "is", "cool");
Stream<String> upperStream = stream.map(String::toUpperCase);
upperStream.forEach(System.out::println); // 输出:JAVA IS COOL

flatMap

flatMap方法可以让我们将一个流中的内容映射为其他的Stream,将多个Stream中的数据合并到同一个Stream中,比如下面这个例子:

Stream<List<Integer>> stream = Stream.of(
        Arrays.asList(1, 2),
        Arrays.asList(3, 4, 5),
        Arrays.asList(6, 7, 8, 9)
);
Stream<Integer> flatStream = stream.flatMap(t -> t.stream());
flatStream.forEach(System.out::println); // 输出:1 2 3 4 5 6 7 8 9

sorted

sorted方法可以用来对流进行排序,比如下面这个例子:

Stream<String> stream = Stream.of("orange", "banana", "apple");
Stream<String> sortedStream = stream.sorted();
sortedStream.forEach(System.out::println); // 输出:apple banana orange

peek

peek方法可以用于调试Stream的中间操作结果,比如下面这个例子:

Stream<String> stream = Stream.of("apple", "banana", "cherry");
Stream<String> peekStream = stream.peek(System.out::println);
peekStream.forEach(System.out::println); // 输出:apple banana cherry

最终操作

最终操作会触发Stream的处理,常用的最终操作有:

forEach

forEach操作可以对每个元素进行处理,比如下面这个例子:

Stream.of(1, 2, 3, 4, 5)
        .filter(x -> x > 2)
        .forEach(System.out::println); // 输出:3 4 5

count

count操作可以统计Stream流长度,比如下面这个例子:

long count = Stream.of("apple", "banana", "cherry").count();
System.out.println(count); // 输出:3

toArray

toArray操作可以将Stream转化为一个数组,比如下面这个例子:

Stream<String> stream = Stream.of("apple", "banana", "cherry");
String[] array = stream.toArray(String[]::new);
System.out.println(Arrays.toString(array)); // 输出:[apple, banana, cherry]

reduce

reduce操作可以将流缩减为一个单独的结果,比如下面这个例子:

Optional<Integer> result = Stream.of(1, 2, 3).reduce((x, y) -> x + y);
System.out.println(result.get()); // 输出:6

collect

collect操作可以将Stream输出为集合,比如下面这个例子:

Stream<Integer> stream = Stream.of(1, 2, 3);
List<Integer> list = stream.collect(Collectors.toList());
System.out.println(list); // 输出:[1, 2, 3]

示例

下面是一个示例,通过Stream实现对一个List的排序和输出:

List<Person> persons = Arrays.asList(
        new Person("Tom", 10),
        new Person("Jerry", 20),
        new Person("Mike", 30),
        new Person("Joey", 40)
);

List<Person> sortedPersons = persons.stream()
        .sorted(Comparator.comparing(Person::getAge))
        .collect(Collectors.toList());

sortedPersons.forEach(System.out::println);

输出结果为:

Person{name='Tom', age=10}
Person{name='Jerry', age=20}
Person{name='Mike', age=30}
Person{name='Joey', age=40}

通过sort()方法可以排序List,通过Collectors.toList()方法可以将Stream转化为List。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你深入了解Java8 Stream流式编程 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • JS控制显示隐藏兼容问题(IE6、IE7、IE8)

    要在IE6、IE7、IE8浏览器中实现JS控制显示隐藏兼容,我们需要使用特定的JavaScript代码和CSS样式。 下面是具体的步骤: 步骤一:HTML代码 首先,在HTML页面中需要先定义具体的结构,如下: <div class="wrapper"> <h3 class="title">这里…

    Java 2023年6月15日
    00
  • 布隆过滤器(Bloom Filter)的Java实现方法

    布隆过滤器(Bloom Filter)的Java实现方法 什么是布隆过滤器? 布隆过滤器(Bloom Filter)是一种数据结构,它可以用来判断一个元素是否可能存在于一个集合中,但并不能确定该元素是否一定存在于该集合中。因为该数据结构的判断结果在误判率(False Positive Rate)上具有一定的不确定性。布隆过滤器可以在空间和时间上做到非常高效,…

    Java 2023年5月26日
    00
  • 使用smartupload组件实现jsp+jdbc上传下载文件实例解析

    使用smartupload组件实现JSP+JDBC上传下载文件,需要经过以下步骤: 下载SmartUpload组件 从官方网站 http://smartupload.io/ 下载最新版本的SmartUpload组件(smartupload.jar),并将其添加到项目的classpath中。 配置Web.xml 在Web.xml中配置SmartUpload的处…

    Java 2023年6月15日
    00
  • java实现抖音代码舞源码

    Java实现抖音代码舞源码的攻略,可分为以下步骤: 1. 获取抖音视频 首先需要获取抖音视频,可以通过解析抖音分享链接来获取。可以使用Java中的网络爬虫技术,发送GET请求获取页面源代码,然后通过正则表达式或Jsoup等HTML解析器解析页面元素,获取视频链接。 以下是一个示例代码段,通过Jsoup获取某个抖音分享链接页面中的视频链接。 import or…

    Java 2023年5月19日
    00
  • java加密算法–MD5加密和哈希散列带秘钥加密算法源码

    下面我来详细讲解Java加密算法——MD5加密和哈希散列带秘钥加密算法源码的完整攻略。 MD5加密算法 概述 MD5(Message Digest Algorithm)是一种单向的哈希算法,可以将任意长度的数据加密成一个128位的二进制串。MD5算法将数据经过多次非线性函数变换和数据干扰后,生成一个唯一的128位散列码,具有很高的安全性,被广泛应用于数据的完…

    Java 2023年5月19日
    00
  • spring scheduled单线程和多线程使用过程中的大坑

    介绍 在使用Spring框架的Scheduled定时任务功能时,我们可以通过配置ThreadPoolTaskExecutor来实现多线程执行定时任务。但是在使用过程中,可能会遇到一些坑,比如在多线程执行过程中,由于任务执行的时间过长,而ThreadPoolTaskExecutor线程池中可用线程数量过少,可能造成任务阻塞,从而导致已经执行的任务无法被及时释放…

    Java 2023年5月19日
    00
  • Java实现“年-月-日 上午/下午时:分:秒”的简单代码

    这里提供两种 Java 实现 “年-月-日 上午/下午时:分:秒” 格式代码的方法。 方法一:使用 SimpleDateFormat 类 import java.text.SimpleDateFormat; import java.util.Date; public class DateFormatDemo { public static void main…

    Java 2023年5月20日
    00
  • ajax遍历xml文档的方法

    当需要在网页中展示和操作XML文档时,可以使用ajax来进行操作。以下是ajax遍历XML文档的方法总结: 1. 创建XMLHttpRequest对象 要使用ajax技术,必须创建XMLHttpRequest对象。XMLHttpRequest是浏览器提供的一个对象用来在浏览器和服务器之间进行数据传输。 //创建XMLHttpRequest对象 let xht…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部