【发布时间】:2016-09-11 18:27:25
【问题描述】:
我正在尝试使用 Java 中的 Lambda 表达式理解以下方法参考代码:
interface MyFunc<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;
}
}
class InstanceMethWithObjectRefDemo {
static <T> int counter(T[] vals, MyFunc<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;
HighTemp[] weekDayHighs = {new HighTemp(89), new HighTemp(82),
new HighTemp(90), new HighTemp(89),
new HighTemp(89), new HighTemp(91),
new HighTemp(84), new HighTemp(83)};
count = counter(weekDayHighs, HighTemp::sameTemp,
new HighTemp(89));
System.out.println(count + " days had a high of 89");
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)};
count = counter(weekDayHighs2, HighTemp::sameTemp,
new HighTemp(12));
System.out.println(count + " days had a high of 12");
count = counter(weekDayHighs, HighTemp::lessThanTemp,
new HighTemp(89));
System.out.println(count + " days had a high less than 89");
count = counter(weekDayHighs2, HighTemp::lessThanTemp,
new HighTemp(19));
System.out.println(count + " days had a high of less than 19");
}
}
我的问题是,为什么函数 sameTemp 只有一个参数?接口声明它必须有 2 个参数,所以对我来说没有意义。也许 hTemp 实例变量对两者都足够了?我从 Java 的完整参考书中得到了这个,作者在那里解释了这一点:
块引用
在程序中,注意 HighTemp 有两个实例方法:
sameTemp( )和lessThanTemp( )。如果两个 HighTemp 对象包含相同的第一个返回 true 温度。如果调用对象的温度低于第二个返回 true 传递的对象的那个。每个方法都有一个 HighTemp 类型的参数,每个方法都返回一个布尔结果。因此,每个都与 MyFunc 功能接口兼容 因为调用对象类型可以映射到func( )的第一个参数和 参数映射到func( )的第二个参数。
谢谢!
【问题讨论】: