java 8的Stream API是一种非常强大的集合处理工具,它提供了一种新的、高效的、声明式的方式来处理集合数据。下面我们就来看一下Java 8 Stream API的所有用法。
可以使用Stream.of()方法创建一个Stream:
Stream<String> stream = Stream.of("a", "b", "c");
也可以使用集合的stream()方法创建一个Stream:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
可以使用filter()方法过滤Stream中的元素:
Stream<String> stream = Stream.of("a", "b", "c");
stream = stream.filter(s -> s.startsWith("a"));
上面的代码将过滤出以字母"a"开头的字符串。
可以使用map()方法将Stream中的元素转换成其他类型:
Stream<String> stream = Stream.of("a", "b", "c");
stream = stream.map(s -> s.toUpperCase());
上面的代码将Stream中的字符串都转换成大写字母。
可以使用concat()方法将多个Stream合并成一个Stream:
Stream<String> stream1 = Stream.of("a", "b", "c");
Stream<String> stream2 = Stream.of("d", "e", "f");
Stream<String> stream = Stream.concat(stream1, stream2);
上面的代码将stream1和stream2合并成一个Stream。
可以使用collect()方法将Stream中的元素收集到一个集合中:
List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());
上面的代码将Stream中的元素收集到一个List中。
可以使用count()、min()、max()等方法对Stream中的元素进行统计:
long count = Stream.of("a", "b", "c").count();
String min = Stream.of("a", "b", "c").min(Comparator.comparing(String::valueOf)).get();
String max = Stream.of("a", "b", "c").max(Comparator.comparing(String::valueOf)).get();
上面的代码分别统计Stream中的元素个数、最小值和最大值。
可以使用sorted()方法对Stream中的元素进行排序:
List<String> list = Stream.of("c", "a", "b").sorted().collect(Collectors.toList());
上面的代码将Stream中的元素按字典序排序,并将排序结果收集到一个List中。
可以使用distinct()方法对Stream中的元素进行去重:
List<String> list = Stream.of("a", "b", "c", "a").distinct().collect(Collectors.toList());
上面的代码将Stream中的重复元素去掉,并将去重结果收集到一个List中。
可以使用limit()方法限制Stream中的元素个数:
List<String> list = Stream.of("a", "b", "c").limit(2).collect(Collectors.toList());
上面的代码将Stream中的元素个数限制为2,并将限制结果收集到一个List中。
可以使用skip()方法跳过Stream中的前n个元素:
List<String> list = Stream.of("a", "b", "c").skip(1).collect(Collectors.toList());
上面的代码将跳过Stream中的第一个元素,并将剩余元素收集到一个List中。
可以使用anyMatch()、allMatch()、noneMatch()等方法对Stream中的元素进行匹配:
boolean anyMatch = Stream.of("a", "b", "c").anyMatch(s -> s.startsWith("a"));
boolean allMatch = Stream.of("a", "b", "c").allMatch(s -> s.length() == 1);
boolean noneMatch = Stream.of("a", "b", "c").noneMatch(s -> s.length() == 3);
上面的代码分别判断Stream中是否有元素以字母"a"开头,是否所有元素长度都为1,是否没有元素长度为3。
可以使用findFirst()、findAny()等方法查找Stream中的元素:
Optional<String> first = Stream.of("a", "b", "c").findFirst();
Optional<String> any = Stream.of("a", "b", "c").findAny();
上面的代码分别查找Stream中的第一个元素和任意一个元素,并将查找结果封装成Optional对象返回。
可以使用reduce()方法将Stream中的元素归约为一个结果:
Optional<Integer> reduce = Stream.of(1, 2, 3).reduce((x, y) -> x + y);
上面的代码将Stream中的元素相加得到一个结果,并将结果封装成Optional对象返回。
14.映射数据
可以使用flatMap()方法将Stream中的元素映射成多个元素:
List<String> list = Stream.of("a,b,c", "d,e,f").flatMap(s -> Stream.of(s.split(","))).collect(Collectors.toList());
上面的代码将Stream中的字符串按逗号分隔,并将分隔结果收集到一个List中。
可以使用groupingBy()方法将Stream中的元素按照某个属性进行分组:
Map<Integer, List<String>> map = Stream.of("a", "b", "cd", "efg").collect(Collectors.groupingBy(String::length));
上面的代码将Stream中的元素按照长度进行分组,并将分组结果收集到一个Map中。
可以使用partitioningBy()方法将Stream中的元素按照某个条件进行分区:
Map<Boolean, List<String>> map = Stream.of("a", "b", "cd", "efg").collect(Collectors.partitioningBy(s -> s.length() == 1));
上面的代码将Stream中的元素按照长度是否为1进行分区,并将分区结果收集到一个Map中。
可以使用sequential()方法将Stream的执行模式设置为串行模式:
Stream<String> stream = Stream.of("a", "b", "c").sequential();
上面的代码将Stream的执行模式设置为串行模式。
可以使用parallel()方法将Stream的执行模式设置为并行模式:
Stream<String> stream = Stream.of("a", "b", "c").parallel();
上面的代码将Stream的执行模式设置为并行模式。
在Stream中,有些方法的返回值是Optional类型,表示存在或不存在某个值。我们可以使用Optional来处理这种情况,避免空指针异常:
Optional<String> optional = Stream.of("a", "b", "c").filter(s -> s.startsWith("d")).findFirst();
String result = optional.orElse("default");
上面的代码过滤出以字母"d"开头的元素,如果没有则返回"default"。
以上就是Java 8 Stream API的所有用法,只要理解了这些用法,基本上就可以应对大多数集合处理的场景了。