当前位置: 首页 > 知识库问答 >
问题:

Java stream.collect()lambda参数类型

万承志
2023-03-14

所有人。

在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如何可以有一个参数,而它应该是两个。

提前谢谢你。

共有1个答案

唐涛
2023-03-14

我认为混乱之处在于你可以做到以下几点:

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