在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");
}
}
答案 0 :(得分:1)
如果您使用Type::instanceMethod
形式的方法引用(不要与instance::instanceMethod
混淆),则生成的lambda会隐式地将实例作为其第一个参数,并使用该实例调用该实例上的方法剩下的论点。因此,HighTemp::sameTemp
相当于(HighTemp ht1, HighTemp ht2) -> ht1.sameTemp(ht2)
,与MyFunc5.func()
T
HighTemp
时的f.func(vals[i], v)
功能签名相同。
换句话说,当您致电vals[i].sameTemp(v)
时,它会被转换为ListView
。
答案 1 :(得分:0)
本例中的第一个参数是vals[i]
本身。所以基本上
f.func(vals[i], v)
将HighTemp::sameTemp
f
作为<{p}}的
vals[i].sameTemp(v)