我有一个整数文件,我想要平均值.以下是我提出的并且它有效,但是想知道是否有更好的(更加通常)的方式..
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)
如果您正在寻找更多的声明性方法,那么您可以这样做:
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)
当然,您始终可以将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)
我希望它有所帮助.
def mean = myFile.readLines().with { sum{it as Integer} / size() }
Run Code Online (Sandbox Code Playgroud)
使用 groovyismswith和as。
内部封闭传递给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)