java 8 stream流的19种用法,可应对大多数集合的处理场景

java 8的Stream API是一种非常强大的集合处理工具,它提供了一种新的、高效的、声明式的方式来处理集合数据。下面我们就来看一下Java 8 Stream API的所有用法。

1.创建Stream

可以使用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();

2.过滤数据

可以使用filter()方法过滤Stream中的元素:

Stream<String> stream = Stream.of("a", "b", "c");
stream = stream.filter(s -> s.startsWith("a"));

上面的代码将过滤出以字母"a"开头的字符串。

3.转换数据

可以使用map()方法将Stream中的元素转换成其他类型:

Stream<String> stream = Stream.of("a", "b", "c");
stream = stream.map(s -> s.toUpperCase());

上面的代码将Stream中的字符串都转换成大写字母。

4.合并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。

5.收集数据

可以使用collect()方法将Stream中的元素收集到一个集合中:

List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());

上面的代码将Stream中的元素收集到一个List中。

6.统计数据

可以使用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中的元素个数、最小值和最大值。

7.排序数据

可以使用sorted()方法对Stream中的元素进行排序:

List<String> list = Stream.of("c", "a", "b").sorted().collect(Collectors.toList());

上面的代码将Stream中的元素按字典序排序,并将排序结果收集到一个List中。

8.去重数据

可以使用distinct()方法对Stream中的元素进行去重:

List<String> list = Stream.of("a", "b", "c", "a").distinct().collect(Collectors.toList());

上面的代码将Stream中的重复元素去掉,并将去重结果收集到一个List中。

9.限制数据

可以使用limit()方法限制Stream中的元素个数:

List<String> list = Stream.of("a", "b", "c").limit(2).collect(Collectors.toList());

上面的代码将Stream中的元素个数限制为2,并将限制结果收集到一个List中。

10.跳过数据

可以使用skip()方法跳过Stream中的前n个元素:

List<String> list = Stream.of("a", "b", "c").skip(1).collect(Collectors.toList());

上面的代码将跳过Stream中的第一个元素,并将剩余元素收集到一个List中。

11.匹配数据

可以使用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。

12.查找数据

可以使用findFirst()、findAny()等方法查找Stream中的元素:

Optional<String> first = Stream.of("a", "b", "c").findFirst();
Optional<String> any = Stream.of("a", "b", "c").findAny();

上面的代码分别查找Stream中的第一个元素和任意一个元素,并将查找结果封装成Optional对象返回。

13.归约数据

可以使用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中。

15.分组数据

可以使用groupingBy()方法将Stream中的元素按照某个属性进行分组:

Map<Integer, List<String>> map = Stream.of("a", "b", "cd", "efg").collect(Collectors.groupingBy(String::length));

上面的代码将Stream中的元素按照长度进行分组,并将分组结果收集到一个Map中。

16.分区数据

可以使用partitioningBy()方法将Stream中的元素按照某个条件进行分区:

Map<Boolean, List<String>> map = Stream.of("a", "b", "cd", "efg").collect(Collectors.partitioningBy(s -> s.length() == 1));

上面的代码将Stream中的元素按照长度是否为1进行分区,并将分区结果收集到一个Map中。

17.串行执行

可以使用sequential()方法将Stream的执行模式设置为串行模式:

Stream<String> stream = Stream.of("a", "b", "c").sequential();

上面的代码将Stream的执行模式设置为串行模式。

18.并行执行

可以使用parallel()方法将Stream的执行模式设置为并行模式:

Stream<String> stream = Stream.of("a", "b", "c").parallel();

上面的代码将Stream的执行模式设置为并行模式。

19.使用Optional

在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的所有用法,只要理解了这些用法,基本上就可以应对大多数集合处理的场景了。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值