在C#中,您可以对列表执行某些操作,如下所示:
return myList.Average(p => p.getValue());
返回所有值的平均值。 Java中有类似的东西吗? (那会省去一个总和的计算,然后除以元素的数量?)
谢谢!
答案 0 :(得分:4)
否,您可以使用guava-libraries Function和transform来实现相同目标。这是an example
您也可以使用Lists.transform(...)。它会将该函数应用于相同的元素(不创建副本)。
答案 1 :(得分:1)
Lambdaj提供了许多这样的功能:
Double totalAge = sumFrom(persons).getAge();
//Divide by size to get Average
答案 2 :(得分:0)
这取决于您正在创建的集合类型。我不认为本机java数组类型支持这样的任何功能。然而,还有其他集合可以做这些事情,例如Apache Commons Math有许多结构可以做这种事情。 Guava是另一个内置了许多优秀Array方法的软件包。
可以轻松实现的另一个选项是扩展您使用的集合。例如:
public class ArrayListExtension extends ArrayList{
public ArrayListExtension(){}
public Double average()
{
Double sum = 0;
Iterator<Double> iterator = this.iterator();
while(iterator.hasNext()){
sum += iterator.next();
}
return sum/this.size();
}
}
注意:此处没有内置的健全性检查。在实际实现中,您需要执行一些try-catch以确保值是实际数字。
答案 3 :(得分:0)
您可以执行以下操作来获取某些数字的平均值。除非你这么做,否则没有多少储蓄。
public static double average(Collection<Number> coll) {
double total = 0;
for(Number n: coll) total += n.doubleValue();
return total/coll.size();
}
答案 4 :(得分:0)
这是Peter Lawrey的答案的安全版本,使用BigDecimal
:
public static double safeAverage(final Collection<? extends Number> coll){
BigDecimal dec = BigDecimal.ZERO;
for(final Number n : coll){
dec = dec.add(BigDecimal.valueOf(n.doubleValue()));
}
return dec.divide(BigDecimal.valueOf(coll.size())).doubleValue();
}
(不太安全,因为BigInteger
和BigDecimal
也扩展Number
。如果与Number
中的任何java.lang
实施一起使用,则会安全