【问题标题】:Returning another anonymous function in lambda expression java在 lambda 表达式 java 中返回另一个匿名函数
【发布时间】:2020-03-12 17:12:17
【问题描述】:

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

【问题讨论】:

  • .apply(y)添加到return addFive的末尾
  • 编译器在我尝试的时候给出了找不到方法apply()的错误。
  • 该编辑完全改变了问题... Comparator 不是函数,因此它没有 apply 方法;它有一个 compare(Object, Object) 方法,那是你需要调用的。

标签: java lambda comparator


【解决方案1】:

根据编辑,您正在寻找的只是利用:

Comparator<Random> c1 = Comparator.comparing(Random::getVal);
Comparator<Random> c2 = Comparator.comparing(Random::getStr).thenComparing(c1);;

那是因为您已经有 Comparators 支持使用 thenComparing API 链接的用例。请注意,这只是对以下代码的简化:

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;

【讨论】:

  • 请检查我的编辑,我正在处理对象,所以三元运算符不起作用,谢谢
  • @Tom_G_99 答案中的编辑对应于您的实际用例。
【解决方案2】:

你已经差不多了——你只是缺少一件事;在addFiveIfPositive 中,您需要返回应用addFive 的结果,而不是返回函数本身。做起来很简单,你只需要return addFive.apply(y);而不是return addFive;

参见下面的 sn-p:

import java.util.function.IntFunction;

class Scratch {
    public static void main(String[] args) {
        System.out.println(doStuff(5));
        System.out.println(doStuff(-1));
    }

    public static int doStuff(int val) {

        IntFunction<Integer> addFive = (x) -> x+5;
        IntFunction<Integer> addFiveIfPositive = (y) -> {
            if (y > 0) return addFive.apply(y);
            else return y;
        };

        return addFiveIfPositive.apply(val);
    }
}

输出:

10
-1

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2021-01-15
    • 2019-09-12
    • 1970-01-01
    • 2017-07-25
    • 2019-06-01
    相关资源
    最近更新 更多