是否可以在Java中的Lambda表达式中返回另一个函数?说我有以下lambda表达式
addFive = (x) -> x+5;
addFiveIfPositive = (y) -> {
if (y > 0) return addFive;
else return y;
};
为了提供一些背景信息,我正在使用lambda表达式定义比较器,对于某些比较器,在某些条件下,我想“链接”已经定义的比较器以不再编写相同的代码就像上面的例子一样。
任何帮助,将不胜感激。
编辑:这是我正在使用的更具代表性的示例。
import java.util.Comparator;
class Random{
Integer val;
String str;
Random(int val, String str){
this.val = new Integer(val);
this.str = str;
}
}
public class Temp{
static Comparator<Random> c1 = (r1, r2) -> (r1.val).compareTo((r2.val));
static Comparator<Random> c2 = (r1, r2) -> {
if ((r1.str).compareTo((r2.str)) == 0){
return c1.apply(r1,r2);
}
return (r1.str).compareTo((r2.str));
};
public static void main(String args){
Random rand1 = new Random(1, "Hello");
Random rand2 = new Random(2, "Hello");
System.out.println(c2.compare(rand1, rand2));
}
}
使用.apply()给我错误
Temp.java:18: error: cannot find symbol
return c1.apply(r1,r2);
^
symbol: method apply(Random,Random)
location: variable c1 of type Comparator<Random>
问题来源:Stack Overflow
根据修改,您所寻找的只是利用:
Comparator<Random> c1 = Comparator.comparing(Random::getVal);
Comparator<Random> c2 = Comparator.comparing(Random::getStr).thenComparing(c1);;
那是因为您已经Comparator支持与thenComparingAPI 链接的用例。请注意,这只是以下代码的简化:
Comparator<Random> c1 = (r1, r2) -> (r1.val).compareTo((r2.val));
Comparator<Random> c2 = (r1, r2) -> {
if ((r1.str).compareTo((r2.str)) == 0){
return c1.compare(r1,r2); //'compare' instead of 'apply'
}
return (r1.str).compareTo((r2.str));
};
在进行编辑之前,您可能已经使用三元运算符来表示条件,例如:
IntFunction<Integer> addFive = x -> x + 5;
IntFunction<Integer> addFiveIfPositive = y -> y > 0 ? y + 5 : y;
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。