一、Stream概述
Java 8中引入了一种新的概念:Stream。它可以被视为一个高级版的Iterator,通过使用流式操作来处理元素的序列,使代码更为简洁和高效。Stream可以理解为是一种对集合进行操作的API。Stream不是一个数据结构,它只是一个操作流程(或者是一个工厂方法)。操作流程可以生成一个最终的结果流和一个终止操作。Stream的操作分为中间操作和终止操作。中间操作返回一个新的Stream对象,或者是一个已存在的同一个对象,终止操作返回一个特定的值,也可以返回void。Stream的特点有:无存储、延迟计算、可消费、可组合等。
二、Stream的创建
Stream可以从一个Array、List、Set等集合中创建。也可以使用Stream工厂方法创建Stream。比如Stream的of()方法可以把一组元素加载到Stream的实例中;或者Stream的iterate()方法可以创建一个无限长的流。Stream的基本类型还有IntStream、LongStream、DoubleStream。
示例代码:
Listlist = Arrays.asList("a", "b", "c"); Stream stream1 = list.stream(); Stream stream2 = Stream.of("a", "b", "c"); Stream stream3 = Stream.iterate(1, n -> n + 1).limit(10); IntStream stream4 = IntStream.range(1, 10);
三、Stream操作
1. Stream中间操作
Stream的中间操作包括:filter、map、flatMap、distinct、sorted、peek、limit、skip、unordered等。其中最常用的filter和map。filter方法接收一个Predicate函数式接口,该方法用于过滤Stream中的元素,只返回符合条件的元素。map方法接收一个Function函数式接口,该方法将Stream中的对象映射为另外一种类型的对象同样传递给下一个阶段。
示例代码:
//过滤出大于2的数字 Listlist1 = Arrays.asList(1, 2, 3, 4, 5); list1.stream().filter(e -> e > 2).forEach(System.out::println); //将List 中的元素转化成大写 List list2 = Arrays.asList("a", "b", "c"); list2.stream().map(String::toUpperCase).forEach(System.out::println);
2. Stream终止操作
Stream的终止操作包括:forEach、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst、findAny等。其中reduce和collect最常用。reduce()方法可以把Stream中的所有元素聚集成一个结果,可以把结果放到一个可选值中,如果Stream为空,则结果为空;collect()方法可以接受一个Collector接口,该接口定义了如何将Stream中的元素收集为一个集合(或一个Map或其他数据结构)。
示例代码:
//求List中的和 List list1 = Arrays.asList(1, 2, 3, 4, 5); int sum = list1.stream().reduce((a, b) -> a + b).get(); //把List 中的元素过滤出age>20的Person,形成一个新的List List list2 = new ArrayList<>(); list2.add(new Person("Tom", 22)); list2.add(new Person("Jack", 18)); list2.add(new Person("Lucy", 24)); List newList = list2.stream().filter(e -> e.getAge() > 20).collect(Collectors.toList());
四、Stream与Parallel Stream的区别
Java 8 中提供了Parallel Stream的特性,可以让Stream中的操作并行执行。Parallel Stream并发执行操作能够更快地处理大规模数据集。Parallel Stream使用线程池来处理元素,如果没有配置线程池默认使用ForkJoinPool来执行任务,默认线程个数为CPU核数。但是,不是所有的Stream操作都可以并行执行,例如reduce()和forEach()等操作是不可以并行的,只有像filter()、map()、sorted()等没有关联的操作才可以执行并行处理。
五、Java 8 Stream Sum实现
示例代码:
int sum = IntStream.range(0, 10).sum(); System.out.println(sum);
六、总结
Java 8中引入的Stream让集合的操作变得更为高级化和优雅化,可以快速处理海量元素。