流表面看起来和集合类似 1.流并不存储其元素,这些元素可能存储在底层的集合中,或者按需生成 2.流的操作不会修改其数据源 3.流的操作是尽可能的惰性执行,意味着直至需要结果时,操作才会执行。
操作流时的典型流程 1.创建一个流 2.指定将初始流转换为其他流的中间操作,可能包含多个步骤 3.应用终止操作,从而产生结果。这个操作会强制执行之前的惰性操作。
Stream(),parallelStream(),产生当前集合所有元素的顺序流或者并行流
流的转换会产生一个新的流,它的元素派生于另一个流中的元素,
Filter 产生一个流,包含当前流中所有满足断言条件的元素。 Map产生一个流,应用于当前流中所有元素所产生的的结果 FlatMap <Function<? super T,? extends Stream<? extends R>> mapper> 通过将mapper应用于当前流中所有元素产生的结果连接到一起而获得的。
调用stream.limit会返回一个新的流,在n个元素之后结束。对于裁剪无限流的尺寸非常有用 Stream randoms = Stream.generate(Math::random).limit(100); 会产生一个包含100个随机数的流 Stream.skip(n)正好相反,会丢弃前n个元素
可以使用concat方法将两个流连接起来 Stream combined = Stream.concat(letter(“Hello”), letter(“World”));
Diatinct会返回一个流,剔除重复元素按顺序产生,
流的排序 Stream long = words.stream().sorted(Compartator.comparing(String::length).reversed()); 最长的字符串排在最前面
Count 会返回流中元素的数量 Max和min 返回最大值和最小值。返回的是一乐类型Optional的值 FindFirst返回的是非空集合中的第一个值
OPtional start = words.filter(s -> s.startsWith(“Q”)).findFirst; 找到第一个以Q开头的单词
不强调第一个匹配,任意一个匹配都可以,就使用findAny方法
只想知道是否匹配使用anyMatch。 所有元素 allMatch 没有任何元素 noneMatch 这3个都是boolean类型,返回true,终端操作,
Optional类型 Optional对象是一种包装器对象,要么包装了类型T的对象,要么没有包装任何对象。
result = noVowels().limit(10) .collect(Collectors.joining(", ")); joining的作用就是加分隔符。
Long getCount() 产生汇总后的元素个数 getSum(),Getaverage()产生汇总后的元素的总合或者平均值,或者在没有任何元素时返回0 getMax(),getMin(),获得汇总的最大值和最小值。
GroupingBy产生一个搜集器。 Counting会对产生搜集到的元素个数。 Map<String, Long> Counts = locales.collect(groupingBy(Locale::getCountry,counting()));
maxBy和minBy会接受一个比较器,并产生下游元素中的最大值或最小值 Map<String,Optional> stateTo = cities.collect(groupingBy(City::getState,MaxBy(Comparator.comparing(City::getPopulation())))); 这个可以产生每个州最大的城市。
Reduce 方法是一种用于从流中计算某个值的通用机制, Optional sum = values.stream().reduce((x,y) ->x + y); 当你有一个对象流的时候,可以使用mapToInt,mapToLong和mapToDouble将其转换为基本类型。
Range(),rangeClosed(),产生一个由给定范围内的整数构成的XXXStream。