开发者社区> 问答> 正文

在Lambda表达式Java中返回另一个匿名函数

是否可以在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

展开
收起
montos 2020-03-27 22:52:26 589 0
1 条回答
写回答
取消 提交回答
  • 根据修改,您所寻找的只是利用:

    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

    2020-03-27 22:52:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载