stream是什么?
1:流是”从支持数据处理操作的源 生成的一系列操作“
A sequence of elements supporting sequential and parallel aggregate operations是支持顺序和并行聚合操作的元素序列,
2:流操作类型:中间操作和终端操作
filter,map,limit,sorted,distinct可以连成一条流水线,collect,forEach,count触发流水线执行并关闭它。
注意:一个流只能遍历一次,流中元素按需计算。
3:流的内部迭代与外部迭代:使用Collection接口需要用户去做迭代(比如用for-each)称外部迭代,Stream用的是内部迭代
外部迭代:List<String> names= new ArrayList<>();
for(Dish d:menu){
names.add(d.getName());
}
内部迭代:List<String> names=menu.stream().map(Dish::getName).collection(toList());
4:使用
(1)筛选:filter谓词筛选,distinct去重,limit截断,skip跳过。
// stream()方法是Collection接口的一个默认方法 : Stream<T> filter(Predicate<? super T> // predicate);
//filter方法参数是一个Predicate函数式接口并继续返回Stream接口
// 解释:从字符串序列中过滤出以字符a开头的字符串并迭代打印输出 stringList.stream().filter((s) ->
stringList.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);
(2)映射:map,flatmap
// 解释:将集合元素转为大写(每个元素映射到大写)->降序排序->迭代输出不影响原来集合 stringList.stream().map(String::toUpperCase).sorted((a, b) -> b.compareTo(a)).forEach(System.out::println);
String[] words={"hello","world"}; //讲一个数组转化成一个数组流 List<String> uni= Arrays.stream(words).map(w->w.split(" ")).flatMap(Arrays::stream).distinct().collect(Collectors.toList());
使用flatmap的效果是将各个数组并不是分别映射成一个流,而是映射成流的内容,简而言之就是把一个流中的每一个值都转换成另一个流然后所有流连接成一个新流。
(3)匹配和查找:检查谓词是否匹配所有元素allMatch,检查谓词是否至少匹配一个元素anyMatchh,流中没有任何元素与给定的谓词匹配noneMatch,查找第一个元素findFirst,查找当前流任一元素findAny。所有的匹配操作都是终结操作,只返回一个boolean类型的结果
(4)规约:reduce,count
// 解释:返回集合中以'a'开头元素的数目 long startsWithACount = stringList.stream().filter((s) -> s.startsWith("a")).count(); System.out.println(startsWithACount); System.out.println(stringList.stream().count());
(5)sort排序