java8新特性 —— Stream流

文章介绍了Java中的StreamAPI,包括如何对集合进行filter过滤、sorted排序、map转换、match匹配、count计数和reduce归约等操作。StreamAPI支持同步和并发执行,提高了代码的简洁性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是 Stream 流?

  • 简单来说,我们可以使用 java.util.Stream 对一个集合(包含一个或多个元素)做各种操作。
  • 这些操作可能是 中间操作(中间操作会返回一个 Stream 流) 亦或是 终端操作(终端操作会返回一个结果)。
  • 需要注意的是,你只能对实现了 java.util.Collection 接口的类做流的操作。
  • Stream 流支持同步执行,也支持并发执行

二、操作

首先,我们创建一个 List 集合:

List<String> stringCollection = new ArrayList<>();
stringCollection.add("ddd2");
stringCollection.add("aaa2");
stringCollection.add("bbb1");
stringCollection.add("aaa1");
stringCollection.add("bbb3");
stringCollection.add("ccc");
stringCollection.add("bbb2");
stringCollection.add("ddd1");

(1)Filter 过滤

类型:中间操作
入参:是一个 Predicate(断言);
返参:是一个 Stream 流;
能够:帮我们筛选出我们需要的集合元素;

stringCollection
    .stream()
    .filter((s) -> s.startsWith("a"))
    .forEach(System.out::println);

// "aaa2", "aaa1"

注意:foreach 是一个终端操作,它的返参是 void, 我们无法对其再次进行流操作。

(2)Sorted 排序

类型:中间操作;
入参:空 或者 一个比较器 Comparator ;
返参:是一个 Stream 流;

stringCollection
    .stream()
    .sorted()
    .filter((s) -> s.startsWith("a"))
    .forEach(System.out::println);

// "aaa1", "aaa2"

(3)Map 转换

类型:中间操作;
入参:Function(例如方法引用、lambda表达式);
返参:是一个 Stream 流;
能够:帮助我们将集合中的每一个元素做功能处理;
例如:下面的示例,通过 map 我们将每一个 string 转成大写:

stringCollection
    .stream()
    .map(String::toUpperCase)
    .sorted((a, b) -> b.compareTo(a))
    .forEach(System.out::println);

// "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"

(4)Match 匹配

类型:终端操作;
入参:Function(例如方法引用、lambda表达式);
返参:是一个 boolean 类型的值;

// 验证 list 中 string 是否有以 a 开头的, 匹配到第一个,即返回 true
boolean anyStartsWithA =
    stringCollection
        .stream()
        .anyMatch((s) -> s.startsWith("a"));

System.out.println(anyStartsWithA);      // true

// 验证 list 中 string 是否都是以 a 开头的
boolean allStartsWithA =
    stringCollection
        .stream()
        .allMatch((s) -> s.startsWith("a"));

System.out.println(allStartsWithA);      // false

// 验证 list 中 string 是否都不是以 z 开头的,
boolean noneStartsWithZ =
    stringCollection
        .stream()
        .noneMatch((s) -> s.startsWith("z"));

System.out.println(noneStartsWithZ);      // true

(5)Count 计数

类型:终端操作;
入参:无
返参:是一个 long 类型的值;

// 先对 list 中字符串开头为 b 进行过滤,让后统计数量
long startsWithB =
    stringCollection
        .stream()
        .filter((s) -> s.startsWith("b"))
        .count();

System.out.println(startsWithB);    // 3

(6)Reduce 归约、减少

类型:终端操作;
入参:Function;
返参:是一个 Optional 类型的对象;
能够:将流中的元素按照指定的规约函数进行合并,得到一个最终的结果,用于求和、求最大值、求最小值等聚合操作;

Optional<String> reduced =
    stringCollection
        .stream()
        .sorted()
        .reduce((s1, s2) -> s1 + "#" + s2);

reduced.ifPresent(System.out::println);
// "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2"

(7)未完待续 … …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值