※ 引述《HiItsMe (Hello)》之铭言:
: 问题参考:https://magiclen.org/ocpjp-collection-sort/
: 关于下列程式码,两个问题想请问版上的高手们:
: 问题1:于下列程式码注解line n1处,s -> s.getEAge() > 50为何无法使用method
: refrence? (Emp::getEAge) > 50
: (略)
: Predicate<Emp> agVal = s -> s.getEAge() > 50; //line n1
根据JLS
https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13
method reference expression只能用在
1. assignment 就是 = 的右边
2. invocation 呼叫方法的参数
3. cast 转型
(Emp::getEAge) > 50这写法中作为 > 的运算子显然不在上列三个里面
就算上面这个比较细节的先不管
Predicate<Emp> agVal = (Emp::getEAge) > 50这写法
也不符合基本的java语法逻辑
> 的用法是比较左右的数值,结果是boolean
Emp::getEAge是个method reference,不是数值不能比较
而 > 的expression的结果是boolean,也不是Predicate<Emp>
Predicate<Emp>的functional interface是 Emp -> boolean
以原本的lambda expression来看,参数s的类别是Emp
s.getEAge() > 50 这个expression结果是boolean
如果要用其他的写法,一样结果要是能解析成 Emp -> boolean
Emp::getEAge是 Emp -> int ,所以要得到 Emp -> boolean
需要的是接上 int -> boolean,变成 (Emp::getEAge)组合(i -> i > 50)
不能直接写 (Emp::getEAge) > 50
组合的方法很多,这边只写一个用java api的方法
要靠java.util.function的inteface转型
Predicate<Emp> agVal =
((Function<Emp, Integer>) Emp::getEAge).andThen(i -> i > 50)::apply;
说真的原本的lambda比较精简...