Java8中对集合可以采用流的方式进行一系列的操作,我们直接通过一些例子说明。
先定义一个list,并初始化一些数据:
List<String> list = new ArrayList() {{
add("小明");
add("小红");
add("小陈");
add("小张");
add("小张");
add("小李");
add("小王");
}};
// 查找集合中的第一个对象
Optional<String> first = list.stream().filter(a -> "小李".equals(a)).findFirst();
System.out.println(first); // 输出: Optional[小李]
System.out.println(first.toString()); // 输出:Optional[小李]
// 返回符合条件的集合
List<String> collect = list.stream().filter(a -> "小张".equals(a)).collect(Collectors.toList());
System.out.println(collect); // [小张, 小张]
System.out.println(collect.toString()); // [小张, 小张]
// filter过滤
List<Integer> list1 = Arrays.asList(21,32,22,33,44);
List<Integer> collect1 = list1.stream().filter(tmp -> tmp > 25).collect(Collectors.toList());
System.out.println(collect1); // [32, 33, 44]
List<String> collect2 = list.stream().map(a -> a + "你好").collect(Collectors.toList());
System.out.println(collect2); // [小明你好, 小红你好, 小陈你好, 小张你好, 小张你好, 小李你好, 小王你好]
// mapToInt 转成IntSream
IntStream intStream = list1.stream().mapToInt(a -> a);
List<Integer> collect3 = intStream.boxed().collect(Collectors.toList());
System.out.println(collect3); // [21, 32, 22, 33, 44]
// mapToDouble mapToLong 同理
// flatMap 把多个集合整成一个
List<List<Integer>> lists = new ArrayList() {{
add(Arrays.asList(1,2,3));
add(Arrays.asList(4,5,6));
}};
System.out.println(lists); // [[1, 2, 3], [4, 5, 6]]
Stream<Integer> integerStream = lists.stream().flatMap(Collection::stream);
List<Integer> collect4 = integerStream.collect(Collectors.toList());
System.out.println(collect4); // [1, 2, 3, 4, 5, 6]
// distinct 去重
List<Integer> list2 = Arrays.asList(1,1,1,2,2,2,3,3,3);
List<Integer> collect5 = list2.stream().distinct().collect(Collectors.toList());
System.out.println(collect5); // [1, 2, 3]
// sort排序
System.out.println(list1);
List<Integer> collect6 = list1.stream().sorted().collect(Collectors.toList());
System.out.println(collect6); // [21, 22, 32, 33, 44]
// peek 不影响主流的情况下,对当前流元素进行提取
System.out.println(list); // [小明, 小红, 小陈, 小张, 小张, 小李, 小王]
List<String> nozhang = new ArrayList<>();
List<String> noming = new ArrayList<>();
List<String> nohong = list.stream().filter(a -> !a.contains("张")).peek(nozhang :: add)
.filter(a -> !a.contains("明")).peek(noming :: add)
.filter(a -> !a.contains("红")).collect(Collectors.toList());
System.out.println(list); // [小明, 小红, 小陈, 小张, 小张, 小李, 小王]
System.out.println(nozhang); // [小明, 小红, 小陈, 小李, 小王]
System.out.println(noming); // [小红, 小陈, 小李, 小王]
System.out.println(nohong); // [小陈, 小李, 小王]
// limit 限定流元素数量
System.out.println(collect4); // [1, 2, 3, 4, 5, 6]
List<Integer> collect7 = collect4.stream().limit(3).collect(Collectors.toList());
System.out.println(collect7); // [1, 2, 3]
// skip 跳过多少个元素
System.out.println(collect4); // [1, 2, 3, 4, 5, 6]
List<Integer> collect8 = collect4.stream().skip(2).collect(Collectors.toList());
System.out.println(collect8); // [3, 4, 5, 6]
// foreach 遍历
System.out.println(collect4); // [1, 2, 3, 4, 5, 6]
List<Integer> foreach = new ArrayList<>();
List<Integer> foreach1 = new ArrayList<>();
collect4.stream().forEach(foreach :: add);
collect4.stream().forEachOrdered(foreach1 :: add);
System.out.println(foreach); // [1, 2, 3, 4, 5, 6]
System.out.println(foreach1); // [1, 2, 3, 4, 5, 6]
// reduce 计算
System.out.println(collect4); // [1, 2, 3, 4, 5, 6]
Integer reduce = collect4.stream().reduce(0, (x, y) -> x + y);
System.out.println(reduce); // 21
Integer integer = collect4.stream().reduce((x, y) -> x + y).orElse(-1);
System.out.println(integer); // 21
Integer sum = collect4.stream().reduce(0, (x, y) -> x + y, Integer::sum);
System.out.println(sum); // 21
// min 最小 max 最大 count总数
System.out.println(collect4); // [1, 2, 3, 4, 5, 6]
Integer min = collect4.stream().min(Integer::compareTo).orElse(-1);
Integer max = collect4.stream().max(Integer::compareTo).orElse(-1);
long count = collect4.stream().count();
System.out.println(min); // 1
System.out.println(max); // 6
System.out.println(count); // 6
// findFirst 第一个 findAny 随便一个
System.out.println(list); // [小明, 小红, 小陈, 小张, 小张, 小李, 小王]
String s = list.stream().findFirst().toString();
String s1 = list.stream().findAny().orElse("");
System.out.println(s); // Optional[小明]
System.out.println(s1); // 小明