Java8中的流Stream方法详解

460 阅读2分钟

这是我参与更文挑战的第6天,活动详情查看: 更文挑战

今天简单介绍下java 8中非常好用的一种数据处理方式,流Stream

每个人在开发过程中应该都用到过,实用性简直太强了。基本上用来操作集合、数组的筛选、 排序、聚合等等是完全没问题的。

目录

一、什么是Stream?

二、生成流

三、Stream的方法

四、流的中间操作

五、统计案例

一、什么是Stream?

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 是用一种直观的方式对Java集合进行运算和表达,类似SQL语句从数据库查询数据。

 int sum = widgets.stream()
                      .filter(w -> w.getColor() == RED)
                      .mapToInt(w -> w.getWeight())
                      .sum();

Stream(流)的特点:

  • Stream并不会存储元素,而是按需计算。

  • 数据源 是流的来源,它可以是集合,数组,I/O channel, 产生器generator 等。

  • 聚合操作 比如filter, map, reduce, find, match, sorted等。

二、生成流

在 Java 8 中, 集合接口有两个方法来生成流:

  • stream() − 取得集合对象的数据集。
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流
  • parallelStream() − 为集合创建并行流。
三、Stream的方法
forEach

遍历数据

Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(5);//获取0-x之间的5个元素,x为x+3
stream2.forEach(System.out::println); // 0 3 6 9 12
filter

过滤流中的某些元素

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); 
long count = strings.stream().filter(string -> string.isEmpty()).count();//过滤为空的字符的数量
limit

获取n个元素

Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);//获取6个元素
stream2.forEach(System.out::println); // 0 2 4 6 8 10
sorted

自然排序,流中元素需实现Comparable接口

 List<String> list = Arrays.asList("aa", "ff", "dd");
 *//String 类自身已实现Compareable接口*
 list.stream().sorted().forEach(System.out::println);
四、流的中间操作

筛选与切片

    **filter**:过滤流中的某些元素
    **distinct:**通过流中元素的 hashCode() 和 equals() 去除重复元素
Stream<Integer> stream = Stream.of( 7, 12, 9, 8, 10, 12, 14, 14);
Stream<Integer> newStream = stream.filter(s -> s > 9) //12、10、12、14、14
        .distinct() //去重 12、10、14
newStream.forEach(System.out::println);

映射

map:将每个元素经过指定函数计算后,转变为新的元素

flatMap:将每个元素经过特定函数转换成新的流,并连接在一起。

List<String> list = Arrays.asList("a,b,c", "1,2,3");
Stream<String> s1 = list.stream().map(s -> s.replaceAll(",", ""));//将每个元素中的逗号去掉
s1.forEach(System.out::println); // abc  123
 
Stream<String> s3 = list.stream().flatMap(s -> {
    String[] split = s.split(",");
    Stream<String> s2 = Arrays.stream(split);
    return s2;
});
s3.forEach(System.out::println); // a b c 1 2 3
五、统计案例

另外,Stream也可以作为统计结果的手段。主要用于int、double、long等基本类型上,可以进行如下操作:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);  
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();  
System.out.println("列表中最大的数 : " + stats.getMax()); 
System.out.println("列表中最小的数 : " + stats.getMin()); 
System.out.println("所有数之和 : " + stats.getSum()); 
System.out.println("平均数 : " + stats.getAverage());