Stream用法

java 8 Stream文档

Stream使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象 。它将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选、排序、聚合等。元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。

Stream的特性

  • 为函数式编程而生:对Stream的任何修改都不会修改背后的数据源,比如对Stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新Stream。
  • 惰式执行:Stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
  • 可消费性:Stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

创建Stream

  1. 通过集合或数组创建

    1
    2
    3
    4
    5
    List<String> list = Arrays.asList("a", "b", "c");
    Stream<String> stream = list.stream();

    String [] strArray = new String[] {"a", "b", "c"};
    Stream<String> stream = Arrays.stream(strArray);
  2. 通过Stream创建

1
2
3
4
5
6
1. 
Stream<String> stream = Stream.of("a", "b", "c");

2.
String [] strArray = new String[] {"a", "b", "c"};
Stream<String> stream = Stream.of(strArray);

中间操作

中间操作会惰式执行。Stream有很多中间操作,多个中间操作可以连接起来形成一个流水线,每一个中间操作就像流水线上的一个工人,每人工人都可以对流进行加工,加工后得到的结果还是一个流。

filter:过滤,对元素按照条件过滤

1
2
3
//过滤掉空值元素
List<String> strings = Arrays.asList("a", "", "b", "c");
strings.stream().filter(string -> !string.isEmpty()).forEach(System.out::println);

sorted:排序,默认为自然升序

1
2
3
4
//自然升序排序
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().sorted().forEach(System.out::println);
//2,2,3,3,3,5,7

map:转换,将元素转换,元素个数不变,元素类型可能改变

1
2
3
4
//获得每个元素的平方数
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().map( i -> i*i).forEach(System.out::println);
//9,4,4,9,49,9,25

distinct:去重

1
2
3
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().distinct().forEach(System.out::println);
//3,2,7,5

limit:限制,返回前面n个元素

1
2
3
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().limit(4).forEach(System.out::println);
//3,2,2,3

skip:限制,扔掉前面n个元素

max、min:最大最小元素

peek:在对流操作过后返回新的流

1
2
3
4
5
6
Stream.of("one", "two", "three", "four")
.filter(e -> e.length() > 3)
.peek(e -> System.out.println("转换之前: " + e))
.map(String::toUpperCase)
.peek(e -> System.out.println("转换之后: " + e))
.collect(Collectors.toList());

终止操作

Stream的中间操作得到的结果还是一个Stream,那么如何把一个Stream转换成我们需要的类型呢?比如计算出流中元素的个数、将流装换成集合等。这就是终止操作要做的事,终止操作执行完过后Stream就会失效,终止操作之后就不能再次使用流,也不能在使用任何中间操作,否则将抛出异常 。

forEach:迭代

1
2
3
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().limit(4).forEach(System.out::println);
//3,2,2,3

count: 统计流中元素个数

1
2
3
List<String> strings = Arrays.asList("a", "b", "c","d");
System.out.println(strings.stream().count());
//4

collect: 归约(收集)操作,可以接受各种做法作为参数,将流中的元素累积成一个汇总结果

1
2
3
4
5
6
7
List<String> list = Arrays.asList("a", "b", "c","d", "Hello", "HelloWorld");
//转换成list
list = list.stream().filter(string -> string.length>3).collect(Collectors.toList());
System.out.println(list);
//Hello,HelloWorld
//转换成set
Set<String> set = list.stream().filter(string -> string.length>3).collect(Collectors.toSet());

toArray:将流转换成数组

1
2
Stream<String> stream = Stream.of("a", "b", "c");
String[] strArray = stream.toArray(String[]::new);
-------- ♥感谢阅读♥ --------