Java 在Lambda中,如何将一个具有一个参数的方法引用到一个具有两个参数的目标?
在Lambda表达式中,我正在研究以下示例。 但我不理解这里代码的逻辑 函数sameTemp在此处执行的方式或位置。因为我将其作为方法引用传递,但随后调用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>
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)