流式编程 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
标签:stream,编程,list,System,流式,collect,println,操作 From: https://www.cnblogs.com/iopasd/p/17580365.html