Java 利用reduce方法校验排序

Java 利用reduce方法校验排序,用户希望检查排序是否正确,使用 reduce 方法检查每对元素。java.util.stream.Stream 接口定义的 reduce 方法传入 BinaryOperator 作为参数。

Java 利用reduce方法校验排序 问题描述

用户希望检查排序是否正确。

Java 利用reduce方法校验排序 解决方案

使用 reduce 方法检查每对元素。

Java 利用reduce方法校验排序 具体实例

java.util.stream.Stream 接口定义的 reduce 方法传入 BinaryOperator 作为参数:

Optional<T> reduce(BinaryOperator<T> accumulator)

BinaryOperator 是一种输入类型和输出类型相同的 Function。根据范例利用reduce方法实现归约操作的讨论,BinaryOperator 的第一个元素通常为累加器,第二个元素传入流的每个值,如例 3-29 所示。

例 3-29 利用 reduce 方法对 BigDecimal 求和

BigDecimal total = Stream.iterate(BigDecimal.ONE, n -> n.add(BigDecimal.ONE))
        .limit(10)
        .reduce(BigDecimal.ZERO, (acc, val) -> acc.add(val)); ➊
System.out.println("The total is " + total);

➊ 使用 BigDecimal 类定义的 add 方法作为 BinaryOperator
与之前一样,lambda 表达式返回的任何值都将作为下一次迭代时变量 acc 的值。在本例中,程序计算前 10 个 BigDecimal 实例的值。
这是 reduce 方法最典型的应用方式。虽然 acc 在本例中用作累加器,但并不意味着它必须作为累加器使用。接下来,我们采用范例利用比较器实现排序讨论的方法来排序字符串。例 3-30 展示的代码段根据字符串的长度对它们进行排序。

例 3-30 根据长度对字符串排序

List<String> strings = Arrays.asList(
    "this", "is", "a", "list", "of", "strings");

List<String> sorted = strings.stream()
    .sorted(Comparator.comparingInt(String::length))
    .collect(toList());    ➊

➊ 结果为 ["a", "is", "of", "this", "list", "strings"]
那么,如何验证排序是否正确呢?答案是比较每对相邻的字符串,确保第一个字符串的长度不大于第二个字符串。reduce 方法就能实现这个功能,如例 3-31 所示(Junit 测试用例的一部分)。

例 3-31 测试字符串排序是否正确

strings.stream()
    .reduce((prev, curr) -> {
        assertTrue(prev.length() <= curr.length()); ➊
        return curr;                                ➋
    });

❶ 检查每对字符串的排序是否正确
curr 成为 prev 的下一个值
对于每对连续的字符串,程序将前一个参数和当前参数分别赋给变量 prevcurrassertTrue 用于测试前一个字符串的长度是否小于或等于当前字符串的长度。需要注意的是,reduce 方法的参数将返回当前字符串 curr 的值,它在下一次迭代时成为 prev 的值。
为使上述代码能正确执行,唯一的要求是采用顺序(sequential)流或有序流。

赞(3)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

Java 实例