在Java中用List(等等)做东西的简洁方法

时间:2011-02-09 16:03:10

标签: java

在C#中,您可以对列表执行某些操作,如下所示:

return myList.Average(p => p.getValue());

返回所有值的平均值。 Java中有类似的东西吗? (那会省去一个总和的计算,然后除以元素的数量?)

谢谢!

5 个答案:

答案 0 :(得分:4)

否,您可以使用guava-libraries Functiontransform来实现相同目标。这是an example

您也可以使用Lists.transform(...)。它会将该函数应用于相同的元素(不创建副本)。

答案 1 :(得分:1)

Lambdaj提供了许多这样的功能:

Double totalAge = sumFrom(persons).getAge();
//Divide by size to get Average

http://code.google.com/p/lambdaj/wiki/LambdajFeatures

答案 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();
}

(不太安全,因为BigIntegerBigDecimal也扩展Number。如果与Number中的任何java.lang实施一起使用,则会安全