gpt4 book ai didi

java - 如何使用 Java 8 lambda 计算序列中多个数字的平均值

转载 作者:搜寻专家 更新时间:2023-10-30 21:22:09 24 4
gpt4 key购买 nike

如果我有集合 Point ,我如何在单次迭代中使用 Java 8 流计算 x,y 的平均值。

以下示例创建两个流并在输入集合上迭代两次以计算 x 和 y 的平均值。他们有什么方法可以使用 java 8 lambda 在单次迭代中计算平均 x,y:

List<Point2D.Float> points = 
Arrays.asList(new Point2D.Float(10.0f,11.0f), new Point2D.Float(1.0f,2.9f));
// java 8, iterates twice
double xAvg = points.stream().mapToDouble( p -> p.x).average().getAsDouble();
double yAvg = points.stream().mapToDouble( p -> p.y).average().getAsDouble();

最佳答案

如果您不介意使用额外的库,我们已将对元组收集器的支持添加到 jOOλ , 最近。

Tuple2<Double, Double> avg = points.stream().collect(
Tuple.collectors(
Collectors.averagingDouble(p -> p.x),
Collectors.averagingDouble(p -> p.y)
)
);

在上面的代码中,Tuple.collectors()结合了几个java.util.stream.Collector实例到单个 Collector 中,该 Collector 将各个值收集到 Tuple 中。

这比任何其他解决方案都更加简洁和可重用。您要付出的代价是,它目前在包装器类型上运行,而不是原始的 double。我想我们得等到 Java 10 and project valhalla for primitive type specialisation in generics .

如果您想自己滚动而不是创建依赖项,相关方法如下所示:

static <T, A1, A2, D1, D2> Collector<T, Tuple2<A1, A2>, Tuple2<D1, D2>> collectors(
Collector<T, A1, D1> collector1
, Collector<T, A2, D2> collector2
) {
return Collector.of(
() -> tuple(
collector1.supplier().get()
, collector2.supplier().get()
),
(a, t) -> {
collector1.accumulator().accept(a.v1, t);
collector2.accumulator().accept(a.v2, t);
},
(a1, a2) -> tuple(
collector1.combiner().apply(a1.v1, a2.v1)
, collector2.combiner().apply(a1.v2, a2.v2)
),
a -> tuple(
collector1.finisher().apply(a.v1)
, collector2.finisher().apply(a.v2)
)
);
}

Tuple2 只是两个值的简单包装器。您不妨使用 AbstractMap.SimpleImmutableEntry或类似的东西。

我还在 an answer to another Stack Overflow question 中详细介绍了这项技术。 .

关于java - 如何使用 Java 8 lambda 计算序列中多个数字的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27925742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com