Java 在Lambda中,如何将一个具有一个参数的方法引用到一个具有两个参数的目标?

Java 在Lambda中,如何将一个具有一个参数的方法引用到一个具有两个参数的目标?,java,lambda,Java,Lambda,在Lambda表达式中,我正在研究以下示例。 但我不理解这里代码的逻辑 函数sameTemp在此处执行的方式或位置。因为我将其作为方法引用传递,但随后调用f.func(vals[I],v),即使sameTemp接受1个参数 package lambda; //A functional interface that takes two reference arguments //and returns a boolean result. interface MyFunc5<T>

在Lambda表达式中,我正在研究以下示例。 但我不理解这里代码的逻辑

函数sameTemp在此处执行的方式或位置。因为我将其作为方法引用传递,但随后调用
f.func(vals[I],v)
,即使sameTemp接受1个参数

package lambda;

//A functional interface that takes two reference arguments 
//and returns a boolean result. 
interface MyFunc5<T> {
    boolean func(T v1, T v2);
}

class HighTemp {

    private int hTemp;

    HighTemp(int ht) {
        hTemp = ht;
    }

    boolean sameTemp(HighTemp ht2) {
        return hTemp == ht2.hTemp;
    }

    boolean lessThanTemp(HighTemp ht2) {
        return hTemp < ht2.hTemp;
    }

}

public class InstanceMethWithObjectRefDemo {

    static <T> int counter(T[] vals, MyFunc5<T> f, T v) {
        int count = 0;

        for (int i = 0; i < vals.length; i++)
            if (f.func(vals[i], v))
                count++;

        return count;
    }

    public static void main(String args[]) {
        int count;

        // Create an array of HighTemp objects.
        HighTemp[] weekDayHighs = { new HighTemp(89), new HighTemp(82), new HighTemp(89)};
        //Why there is no error referencing sameTemp to the place of MyFunc5<T> f because MyFunc5<T> f
        //has 2 args while sameTemp has 1
        count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));
        System.out.println(count + " days had a high of 89");

    }

}
包lambda;
//接受两个引用参数的函数接口
//并返回一个布尔结果。
接口MyFunc5{
布尔函数(T v1,T v2);
}
类高温{
私有int hTemp;
高温(内部高温){
hTemp=ht;
}
布尔sameTemp(高温ht2){
返回hTemp==ht2.hTemp;
}
布尔lessThanTemp(高温ht2){
返回hTemp
本例中的第一个参数是
vals[i]
本身。所以基本上

f.func(vals[i], v)
使用
HighTemp::sameTemp
作为
f
变为

vals[i].sameTemp(v)

当您有一个形式为
Type::instanceMethod
(不要与
instance::instanceMethod
混淆)的方法引用时,生成的lambda隐式地期望一个实例作为其第一个参数,并使用剩余参数调用该实例上的方法。因此,
HighTemp::sameTemp
相当于
(HighTemp ht1,HighTemp ht2)->ht1.sameTemp(ht2)
,当
T
HighTemp
时,它与
MyFunc5.func()
的函数签名相同

换句话说,当您调用
f.func(vals[i],v)
时,它将被转换为
vals[i].sameTemp(v)