从文件中获取整数平均值的最常用方法是什么?

Abu*_*iam 4 groovy

我有一个整数文件,我想要平均值.以下是我提出的并且它有效,但是想知道是否有更好的(更加通常)的方式..

 File myFile = new File("myListOfNumbers.txt")
 int total = 0
 int count = 0
 myFile.eachLine {line->
  total = Integer.parseInt(line) + total
  count++
 }
println "Avg is ${total /count}"
Run Code Online (Sandbox Code Playgroud)

Szy*_*iak 5

如果您正在寻找更多的声明性方法,那么您可以这样做:

def avg2 = myFile.readLines()
        .sum({ it.toInteger() }) / myFile.readLines().size()
Run Code Online (Sandbox Code Playgroud)

唯一的问题是这不是很有效,因为我们在这里调用readLines()方法两次.当然,我们可以从这个表达式中拆分声明以使代码更有效,然后我们将得到这样的结果:

def lines = myFile.readLines()
def avg2 = lines.sum({ it.toInteger() }) / lines.size()
Run Code Online (Sandbox Code Playgroud)

与Java 8 Stream API混合使用

当然,您始终可以将Groovy方法与Java 8方法混合使用,并使用.average()Java Stream API中的内置方法.在这种情况下,您的代码看起来与此类似:

def avg1 =  Files.lines(myFile.toPath())
        .mapToInt({ s -> s.toInteger() })
        .average()
        .getAsDouble()
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助.

  • @tim_yates啊,是的,`Files.lines()`比`.readLines()`更好.但是`average()`不需要内存中的所有文件行,甚至不需要整数值.它(`java.util.IntPipeline :: average`)通过在`[1]`中对它们求和并在`[0]`中递增一个计数器,将值收集到`long [2]`中,然后在结束.所以@Szymon这里建议使用`Files.lines()`而不是:) (2认同)

qlo*_*own 5

槽点:

def mean = myFile.readLines().with { sum{it as Integer} / size() }
Run Code Online (Sandbox Code Playgroud)

使用 groovyismswithas

内部封闭传递给with,可以使用sum()size()直接,目标将是该对象.with被调用,在我们的例子线的列表。

最时髦:

def mean = myFile.mean()
Run Code Online (Sandbox Code Playgroud)

我当然作弊了,并且事先做了这个:

File.metaClass.mean {
    delegate.readLines().with { sum{it as Integer} / size() }
}
Run Code Online (Sandbox Code Playgroud)