您的位置:

Java 8 Stream Sum

一、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。

示例代码:

List list = 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的数字
List list1 = 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让集合的操作变得更为高级化和优雅化,可以快速处理海量元素。