所有人。
在Oracle关于缩减的教程(https://docs.Oracle.com/javase/tutorial/collections/streams/Reduction.html)中,我们提供了如何使用stream.collect()方法的示例。任务是查找流中值的平均值。本例中有辅助类平均器:
class Averager implements IntConsumer
{
private int total = 0;
private int count = 0;
public double average() {
return count > 0 ? ((double) total)/count : 0;
}
public void accept(int i) { total += i; count++; }
public void combine(Averager other) {
total += other.total;
count += other.count;
}
}
然后我们就有了这样的结果:
Averager averageCollect = roster.stream()
.filter(p -> p.getGender() == Person.Sex.MALE)
.map(Person::getAge)
.collect(Averager::new, Averager::accept, Averager::combine).
,其中BiConsumer-具有函数方法accept(Object,Object)的函数接口。
问题是如何使用aveReager::accept(signature void accept(int i)--一个参数,不返回值)来代替collect()的第二个参数--该函数不返回值,但接受两个参数。如果我们深入研究所有这些库调用,我们可以发现输入lambda的一些转换,这些转换导致对accept(a,b)的适当调用--带有两个参数,但是编译器最初是如何识别它是正确的呢?
我们可以像这样重写collect()调用:
使用lambda而不是methods引用,但我仍然不明白第二个lambda如何可以有一个参数,而它应该是两个。
提前谢谢你。
我认为混乱之处在于你可以做到以下几点:
Averager avg = new Averager();
BiConsumer<Averager, Integer> consumer = Averager::accept;
consumer.accept(avg, 17);
也就是说,尽管averager::accept
有一个签名表示它接受一个参数(int i
),但它可以被视为一个接受两个参数的biconsumer
:被调用方(“this
”)和一个参数(int i
)。
进一步阅读:Java™教程:方法参考
问题内容: 好吧,我们有: 我可以像这样使用它: 我们如何在代码中解析该lambda参数的实际值? 当我们将其用作内联实现时,从该类的方法中提取并没有那么困难。 我想念什么吗?或者只是Java不支持lambda类? 为了更清洁: 该lambda被包裹(在提到的中),它在提取实际参数以进行进一步的反射方法调用。在此之前,它使用Spring的将提供的参数转换为目标参数。 在这种情况下,方法是在实际应用
问题内容: 假设我在Java 8中具有以下功能接口: 在某些情况下,我需要没有参数或返回类型的操作。所以我写这样的东西: 但是,它给了我编译错误,我需要写成 这很丑。有什么办法摆脱类型参数? 问题答案: 你以后的语法可能与一个小帮手功能,其转换成(你可以将它放在为例):
假设我在Java 8中有以下功能接口: 对于某些情况,我需要一个没有参数或返回类型的操作。所以我写了这样的东西: 这很难看。有什么方法可以去掉类型参数吗?
我是Kotlin的新手,很难理解下面的代码 所以这个函数叫做,它的输入参数是一个名为的函数,它是
一、泛型 Scala 支持类型参数化,使得我们能够编写泛型程序。 1.1 泛型类 Java 中使用 <> 符号来包含定义的类型参数,Scala 则使用 []。 class Pair[T, S](val first: T, val second: S) { override def toString: String = first + ":" + second } object ScalaAp