stream流的归约

stream流的归约

stream流的归约

stream流的归约是将stream流中的元素聚合,类似约sql的聚合。归约属于stream流的终端操作。

终端操作的注意点:

  1. stream流没有终端操作不会处理任何数据,没有终端操作的stream流很大可能是个bug!
  2. stream流只能有一个终端操作,并且不能再次重用该stream流,否则会抛出IllegalStateException异常

使用BinaryOperator二元操作对stream流归约

需要注意2点

  1. stream流可以通过parallel()进行并行计算

  2. BinaryOperator应该具有associativity(结合律,关联性)

A = B ⋃ C ⇒ R e d ( A ) = R e d ( R e d ( B ) , R e d ( C ) ) A = B ⋃ C ⇒ Red(A) = Red(Red(B), Red(C)) A=BCRed(A)=Red(Red(B),Red(C))

BinaryOperator归约中的identity element(单位元,即 i op a = a op i = a,i为单位元)

探索Stream API中的归约方法

reduce()

有单位元的归约

List<Integer> ints = List.of(3, 6, 2, 1);
BinaryOperator<Integer> sum = (a, b) -> a + b;
int identity = 0;

int result = identity;
for (int i: ints) {
    result = sum.apply(result, i);
}

System.out.println("sum = " + result);

使用reduce()

Stream<Integer> ints = Stream.of(0, 0, 0, 0);

int sum = ints.reduce(10, (a, b) -> a + b);
System.out.println("sum = " + sum);

结果

sum = 10

没有单位元的归约

Stream<Integer> ints = Stream.of(2, 8, 1, 5, 3);
Optional<Integer> optional = ints.reduce((i1, i2) -> i1 > i2 ? i1: i2);

if (optional.isPresent()) {
    System.out.println("result = " + optional.orElseThrow());
} else {
    System.out.println("No result could be computed");
}

结果

result = 8

在一个方法中融合映射合归约

<U> U reduce(U identity,
             BiFunction<U, ? super T, U> accumulator,
             BinaryOperator<U> combiner);

示例

Stream<String> strings = Stream.of("one", "two", "three", "four");

BinaryOperator<Integer> combiner = (length1, length2) -> length1 + length2;
BiFunction<Integer, String, Integer> accumulator =
        (partialReduction, element) -> partialReduction + element.length();

int result = strings.reduce(0, accumulator, combiner);
System.out.println("sum = " + result);

结果

sum = 15

示意图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Stream是Java 8新引入的一种处理集合数据的抽象概念。它允许我们以声明性的方式对数据进行操作,而不是通过传统的循环和条件语句。Stream可以被看作是一种高级迭代器,它可以串行或并行地处理数据,并且提供了很多用于数据处理的方法,比如过滤、映射、排序、归约等。 生成Stream的方式有多种。一种常见的方式是通过集合的stream()方法或parallelStream()方法来创建一个顺序或并行,如下所示: List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream(); // 创建一个顺序 Stream<String> parallelStream = list.parallelStream(); // 创建一个并行 另一种方式是通过Stream中的静态方法of()、iterate()和generate()来创建。of()方法可以将一组元素直接转换为,iterate()方法可以生成一个无限并进行迭代操作,generate()方法可以生成一个无限并使用提供的Supplier函数生成元素。下面是使用这些方法的示例: Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6); Stream<Integer> stream2 = Stream.iterate(0, (x) -> x < 10, (x) -> x + 2); // 创建一个从0开始每次增加2的无限,并截取前5个元素 Stream<Double> stream3 = Stream.generate(Math::random).limit(3); // 创建一个包含3个随机数的 回答完问题后,我再提几个相关问题: 相关问题: 1. Stream的优势是什么? 2. Stream与传统的循环有什么不同? 3. 如何使用Stream进行数据的筛选和过滤? 4. Stream中的映射操作有哪些方法可以使用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值