0x01 foreach
遍历执行
// output 123
List<Integer> list = Arrays.asList(1, 2, 3);
list.stream().forEach(System.out::print);
0x02 map
将流中的A元素转换成B
// output 1, 2, 3,
List<Integer> list = Arrays.asList(1, 2, 3);
list.stream().map(i -> String.valueOf(i) + ", ").forEach(System.out::print);
0x03 flatmap
将流中中嵌套的流展开。
// output 123456
Map<Integer, List<Integer>> map = new HashMap<>();
map.put(1, Arrays.asList(1, 2, 3));
map.put(2, Arrays.asList(4, 5, 6));
map.entrySet().stream().flatMap(e -> e.getValue().stream()).forEach(System.out::print);
0x04 filter
过滤元素
// output 12
List<Integer> list = Arrays.asList(1, 2, 3);
list.stream().filter(i -> i < 3).forEach(System.out::print);
0x05 count
统计流中元素个数
// output 3
List<Integer> list = Arrays.asList(1, 2, 3);
long count = list.stream().count();
System.out.println(count);
0x06 max/min
返回流中的最大值和最小值
// output 3
List<Integer> list = Arrays.asList(1, 2, 3);
Optional<Integer> max = list.stream().max((i, j) -> i - j);
if (max.isPresent()) {
System.out.println(max.get());
}
0x07 findFirst
找到流中第一个匹配的元素
// output 2
List<Integer> list = Arrays.asList(1, 2, 3);
Optional<Integer> o = list.stream().filter(i -> i > 1).findFirst();
if (o.isPresent()) {
System.out.println(o.get());
}
0x08 findAny
找到流中任意一个匹配的元素
// output NOT SURE
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
Optional<Integer> o = list.stream().parallel().filter(i -> i > 1).findAny();
if (o.isPresent()) {
System.out.println(o.get());
}
0x09 anyMatch
filter + findAny的结合体
0x0A allMatch
判断流中所有元素都匹配条件
// output true
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
boolean isGtZero = list.stream().allMatch(i -> i > 0);
System.out.println(isGtZero);
0x0B noneMatch
判断流中元素都不匹配条件
// output true
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
boolean isGt8 = list.stream().noneMatch(i -> i > 8);
System.out.println(isGt8);
0x0C reduce
对流中所有元素依次执行某操作
// output 28
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
Integer sum = list.stream().reduce(0, (i, j) -> i + j);
System.out.println(sum);
0x0D collect
收集流中的元素
collect(Supplier, BiComsumer, BiComsumer<R, R>):R
- Supplier
一个能创建目标类型实例的方法。 - BiComsumer
一个将元素添加到目标实例的方法。 - BiComsumer<R, R> 将两个元素整合到一起的方法。
collect(Collector):R
- Collectors.toCollection(集合构造函数) 构造一个集合
- Collectors.toList() 构造一个list
- Collectors.toSet() 构造一个set
- Collectors.toMap(getKey(), getValue(), keyRepeat()) 构造一个map
- Collectors.toMap(getKey(), getValue(), keyRepeat(), constructor()) 构造一个map
- Collectors.joining() 将字符串连接起来
- Collectors.joining(分隔符) 将字符串和分隔符连接起来
- Collectors.groupingBy(组名) 根据组名将流分为N个组,返回值的key值是组名,value是一个List
- Collectors.partitioningBy(判断条件) 根据组名将流分为2个组,返回值的key值是true和false,value是一个List
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
HashSet<Integer> hs = list.stream().collect(Collectors.toCollection(HashSet::new));
0x0E distinct
不改变流中元素顺序,去除流中重复元素。
// output aabb
Stream<String> words = Stream.of("aa", "aa", "bb");
words.distinct().forEach(System.out::print);
0x0F sorted
对流中元素进行排序。也可以提供一个Comparator。
// output aabbcc
Stream<String> words = Stream.of("bb", "aa", "cc");
words.sorted().forEach(System.out::print);
// output aaabbc
words = Stream.of("bb", "aaa", "c");
words.sorted((str1, str2) -> str2.length() - str1.length()).forEach(System.out::print);
0x10 peek
对流中元素执行操作并返回一个该流
// output bbaacc3
Stream<String> words = Stream.of("bb", "aa", "cc");
long total = words.peek(System.out::print).count();
System.out.println(total)