gpt4 book ai didi

java - 双冒号的使用——静态和非静态方法引用的区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:58 25 4
gpt4 key购买 nike

<分区>

编辑:我的问题在这里得到了回答。总而言之,我对非静态方法引用的用法感到困惑。功能接口(interface)和引用方法有不同数量的参数。

回答我问题的是 comment以及接受的答案。


我目前正在阅读有关流缩减方法的 Java 教程 (https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html)。在那里我发现了一段我认为是错误的代码,所以我做了一个更简单的代码来确定。

// B.java file
import java.util.*;

public class B
{
public static void main(String[] args)
{
List<Integer> zahlen = new LinkedList<Integer>();
zahlen.add(1);
zahlen.add(2);
zahlen.add(3);
Averager averageCollect = zahlen.stream()
.collect(Averager::new, Averager::addcount, Averager::combine);
System.out.println(averageCollect.average());
}
}

// Averager.java from the official Java tutorial
public class Averager
{
private int total = 0;
private int count = 0;

public double average() {
return count > 0 ? ((double) total)/count : 0;
}

public void addcount(int i) { total += i; count++;}
public void combine(Averager other) {
total += other.total;
count += other.count;
}
}

我认为这行不通的原因是:

Averager averageCollect = zahlen.stream()
.collect(Averager::new, Averager::addcount, Averager::combine);

Stream.collect ( https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#collect-java.util.function.Supplier-java.util.function.BiConsumer-java.util.function.BiConsumer- ) 的 Java 文档中,它说作为第二个参数,需要一个与功能接口(interface) BiConsumer 匹配的函数,它具有具有两个参数的抽象方法。但是Averager.addcountAverager.combine只有一个参数。

我还检查了 lambda 表达式:

Averager averageCollect = zahlen.stream()
.collect(Averager::new, (a,b) -> a.addcount(b), (a,b) -> a.combine(b));

这段代码也有效,作为第二个和第三个参数,我有两个参数的函数。

为什么我上面写的代码可以正常工作,即使只给出了一个参数的函数?当我将 Averager.addcountAverager.combine 都更改为具有这样的两个参数时,为什么会出现错误消息?

public void addcount(Averager one, Integer i)
public void combine(Averager one, Averager other)

如果我这样做,我会收到以下错误消息:

B.java:12: error: no suitable method found for collect(Averager::new,Averager::addcount,Averager::combine)      .collect(Averager::new, Averager::addcount, Averager::combine);      ^    method Stream.collect(Supplier,BiConsumer,BiConsumer) is not applicable      (cannot infer type-variable(s) R#1        (argument mismatch; invalid method reference          cannot find symbol            symbol:   method addcount(R#1,Integer)            location: class Averager))    method Stream.collect(Collector) is not applicable      (cannot infer type-variable(s) R#2,A        (actual and formal argument lists differ in length))  where R#1,T,R#2,A are type-variables:    R#1 extends Object declared in method collect(Supplier,BiConsumer,BiConsumer)    T extends Object declared in interface Stream    R#2 extends Object declared in method collect(Collector)    A extends Object declared in method collect(Collector)1 error

请帮助我理解。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com