记录每一天,流式编程 stream

发布时间 2023-08-01 13:35:10作者: 吊车尾的日常

流式编程 stream

  我以为遇到 lambda 已经够让我惊喜了,万万没想到 stream 的出现,才让我发现它才是函数式编程的主角。

  特点:

  • 无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。

  对 stream 的任何修改都不会修改背后的数据源,比如对 stream 执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新的 stream。

  • 惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
  • 可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

  对 流 的操作分为两类,中间操作和结束操作。 中间操作总是会惰式执行,只有在结束操作后才会把所有的中间操作执行。计算完后 stream 就会失效。

  区分中间操作和结束操作最简单的方法,就是看方法的返回值,返回值为stream的大都是中间操作,否则是结束操作。

public class streamAPITest {

@Test
public void t1(){
List<String> list = Arrays.asList("张三", "李四", "张三丰", "trh", "xnn","李四", "张三", "hzx");

//遍历
list.stream().forEach(i->{
System.out.println(i);
});

//获取所有姓张的人名 且 长度等于 3 的
List<String> a = list.stream()
.filter(s -> s.contains("张"))
.filter(s -> s.length() == 3)
.collect(Collectors.toList());
System.out.println("获取所有姓张的人名 且 长度等于 3 的" + a);

//去除重复元素
List<Object> objects = new ArrayList<>();
list.stream().distinct().forEach(i->{
objects.add(i);
});
System.out.println(objects);


//根据长度排序
List<String> collect = list.stream().sorted((s1, s2) ->
s2.length() - s1.length()
).collect(Collectors.toList());
System.out.println("根据长度排序"+collect);
}
}

学习源头: https://github.com/CarpenterLee