Abu*_*que 8 java java-8 functional-interface method-reference
public interface MyFunc<T> {
boolean func(T v1, T v2);
}
Run Code Online (Sandbox Code Playgroud)
public class HighTemp {
private int hTemp;
HighTemp(){
}
public HighTemp(int ht) {
this.hTemp = ht;
}
boolean sameTemp(HighTemp ht2){
return hTemp == ht2.hTemp;
}
boolean lessThanTemp(HighTemp ht2){
return hTemp < ht2.hTemp;
}
}
Run Code Online (Sandbox Code Playgroud)
class InstMethWithObjRef {
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;
//Create an array of HighTemp objects.
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::lessThanTemp,new HighTemp(89));
System.out.println(count);
}
}
Run Code Online (Sandbox Code Playgroud)
请解释一下
boolean sameTemp()与func()功能界面兼容.sameTemp()方法func()在功能界面中实现.count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89)); 工作中请分别解释所有要点.
等价的 lambda表达式HighTemp::lessThanTemp是
(highTemp1, highTemp2) -> {
return highTemp1.lessThanTemp(highTemp2);
}
Run Code Online (Sandbox Code Playgroud)
这是对特定类型的任意对象的实例方法的Java8命名引用的特征之一
考虑以下示例,
interface FIface<T> {
int testMethod(T a, T b);
}
class Test2 {
private String str;
Test2(String str) {
this.str = str;
}
int ok(Test2 test2) {
System.out.println("Currnet String : "+ this.str);//Refer to t1
System.out.println("Test String : "+test2.str);//Refer to t2
return 0;
}
}
public class Test {
public static <T> int checkCall(T t1, T t2, FIface<T> fiFace) {
//Here Test2 :: ok is equivalent to t1.ok(t2)
return fiFace.testMethod(t1, t2);
}
public static void main(String[] args) {
checkCall(new Test2("a"), new Test2("b"), Test2 :: ok);
}
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT
Currnet String : a
Test String : b
Run Code Online (Sandbox Code Playgroud)
注意这里Test2 :: ok对于调用有效甚至ok方法不是静态的.
当你调用该方法checkCall的功能界面,你仍然有两个参数,其是t1与t2并为有效的lambda表达式可以有参数,(Test t1, Test t2)所以你的方法Test2 :: ok这里成为有效的呼叫.在内部,它以这种方式工作t1.ok(t2).
所以,fiFace.testMethod(t1, t2);将调用方法作为t1.ok(t2)
| 归档时间: |
|
| 查看次数: |
2932 次 |
| 最近记录: |