Stream(流)简介
流使程序员得以更高的抽象层次上对集合进行操作
person类属性
private String name;
private int age;
list.stream() 将集合转换成流
.filter(person -> person.getAge() != 21) 过滤
.map(Person::getName) 将list<Person>转化为list<String>
.sorted()排序
.collect(Collectors.toList())将流转化成list
.forEach(System.out::println);
外部迭代和内部迭代
我们可以把集合比作一个工厂的仓库,一开始工厂比较落后,要对货物作什么修改,只能工人亲自走进仓库对货物进行处理,有时候还要将处理后的货物放到一个新的仓库里面。在这个时期,我们需要亲自去做迭代,一个个地找到需要的货物,并进行处理,这叫做外部迭代。
List<Person> list = new ArrayList<>();
for操作,iterator都属于外部迭代
list.stream()转换成流之后对这个流操作,属于内部迭代
后来工厂发展了起来,配备了流水线作业,只要根据需求设计出相应的流水线,然后工人只要把货物放到流水线上,就可以等着接收成果了,而且流水线还可以根据要求直接把货物输送到相应的仓库。这就叫做内部迭代,流水线已经帮你把迭代给完成了,你只需要说要干什么就可以了(即设计出合理的流水线)。
常用流操作
- filter(T->boolean)
保留boolean为ture的元素 - distinct()
去重,需要重写equals()和hashCode() - sorted()/sorted((T,T)->int)
如果流中的元素的类实现了 Comparable 接口,即有自己的排序规则,那么可以直接调用 sorted() 方法对元素进行排序,
如 Stream反之, 需要调用 sorted((T, T) -> int) 实现 Comparator 接口 - limit(long n)
返回前n个元素 - skip(long n)
去掉前n个元素 - map(T->R)
将流中的每一个元素T映射成R - flapMap(T->Stream)
将流中的每一个元素T映射成为一个流,再把每一个流连接成一个流 - anyMatch(T -> boolean)
流中是否有一个元素匹配给定的 T -> boolean 条件 - allMatch(T -> boolean)
流中是否所有元素都匹配给定的 T -> boolean 条件 - noneMatch(T -> boolean)
流中是否没有元素匹配给定的 T -> boolean 条件 - findAny() 和 findFirst()
findAny():找到其中一个元素 (使用 stream() 时找到的是第一个元素;使用 parallelStream() 并行时找到的是其中一个元素)
findFirst():找到第一个元素 - reduce((T, T) -> T) 和 reduce(T, (T, T) -> T)
用于组合流中的元素,如求和,求积,求最大值等 - count()
返回流中元素个数,结果为 long 类型 - collect()
收集方法,我们很常用的是 collect(toList()),当然还有 collect(toSet()) 等,参数是一个收集器接口 - forEach()
返回结果为 void,很明显我们可以通过它来干什么了,比方说:打印输出。
版权声明:本文为qq_45366515原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。