【发布时间】:2016-12-08 02:00:06
【问题描述】:
我对这个方法引用语法有点困惑。
counter() 期望 BiFunction 但是 HighTemp::lessThanTemp 是一个有效的参数,尽管 HighTemp.lessThanTemp() 只接受一个参数。
这行到底发生了什么:if (f.func(vals[i], v))?
MCVE:
import java.util.function.BiFunction;
class Demo {
static class HighTemp {
private int hTemp;
HighTemp(int ht) { hTemp = ht; }
boolean lessThanTemp(HighTemp ht2) {
return hTemp < ht2.hTemp;
}
}
static <T> int counter(T[] vals, BiFunction<T,T,Boolean> f, T v) {
int count = 0;
for (int i=0; i < vals.length; i++) {
if (f.apply(vals[i], v)) { // THIS LINE
count++;
}
}
return count;
}
public static void main(String args[]) {
HighTemp[] weekDayHighs2 = { new HighTemp(32), new HighTemp(12),
new HighTemp(24), new HighTemp(19),
new HighTemp(18), new HighTemp(12),
new HighTemp(-1), new HighTemp(13) };
int count = counter(weekDayHighs2, HighTemp::lessThanTemp, new HighTemp(19));
System.out.println(count + " days had a high of less than 19");
}
}
【问题讨论】:
-
提示:不要定义自己的
MyFunc接口,而是使用BiFunction或其子类型BinaryOperator。 -
@dimo414 编译结果是“5天的高点小于19”。我对这实际上是如何工作感到困惑
-
@JimGarrison
f.func(vals[i],v)接受两个参数,但 f.func 不是引用HighTemp::lessThanTemp,它只接受一个参数。boolean lessThanTemp(HighTemp ht2) -
啊,我误读了这个问题。第一个参数没有得到
this引用吗?我似乎记得读过编译器神奇地推断出来。 -
我喜欢有趣的精心编写的问题,这些问题挑战我挖掘文档并让我学习新东西。欢迎使用 StackOverflow!
标签: java lambda java-8 method-reference