java 实现一个求数的最大差的归约运算?

gzszwxb4  于 2023-01-07  发布在  Java
关注(0)|答案(2)|浏览(99)

我正在寻找一个合适的基于流的约简操作来找到一个双链表的最大差值。(请不要使用老式嵌套for循环的解决方案...)
假设我的双重列表是
第一个月
则最大差值将导致该值
9.1 - 0.3 = 8.8
我使用java流的第一个工作方法是:

List<Double> list = List.of(1.1, 0.3, 7.8, 1.0, 9.1, 2.3);
double maxDiff = list.stream().max(Double::compareTo).get()
    - list.stream().min(Double::compareTo).get();

如何为约简操作Stream.reduce()实现自定义累加器和组合器以实现相同的功能?

tyg4sfes

tyg4sfes1#

通过使用teing收集器,可以避免在列表上进行两次流式传输:

double diff = list.stream()
                  .collect(Collectors.teeing(
                          Collectors.reducing(Double::max),
                          Collectors.reducing(Double::min),
                          (max,min) -> max.get() - min.get()));

或使用汇总统计

DoubleSummaryStatistics statistics = list.stream()
                                         .mapToDouble(Double::doubleValue)
                                         .summaryStatistics();
double diff = statistics.getMax() - statistics.getMin();
zbq4xfa0

zbq4xfa02#

对于小列表,您可以将列表与其自身进行笛卡尔乘积,并在减少之前计算每个组合的差异:

double maxDiff = list.stream()
                     .flatMap(a -> list.stream().map(b -> a - b))
                     .reduce(Double::max)
                     .get();
System.out.println(maxDiff);

相关问题