【问题标题】:Replace functional interface with Function用函数替换函数接口
【发布时间】:2019-01-29 01:52:45
【问题描述】:

我对这段代码有点困惑。为什么不编译?

@FunctionalInterface
public interface Inter {
  BigDecimal method (BigDecimal param);
}

public class Main {
  public static void main {
    Function<BigDecimal, BigDecimal> func = param -> BigDecimal.ZERO;
    Inter i1 = param -> BigDecimal.ZERO; // compile
    Inter i2 = func; // not compile
  }
}

【问题讨论】:

  • @CommonMan 它不是那个的副本。
  • @DodgyCodeException,由于Lambda expression's parameter func cannot redeclare another local variable defined in an enclosing scope. ,Op无法编译最后一行,链接stackoverflow.com/questions/22773003/…中提到了上述错误的答案,所以它是重复的,不是吗?
  • @CommonMan 不,这不是因为“Lambda 表达式的参数 func 无法重新声明在封闭范围内定义的另一个局部变量。” func 不是 lambda 表达式参数。

标签: java lambda


【解决方案1】:

看看package java.util.function description

函数式接口为 lambda 表达式和方法引用提供目标类型。

这并不意味着函数式接口是任意具体类的变量的目标类型(例如您的例子中的Function&lt;BigDecimal, BigDecimal&gt;)。

要在需要特定功能接口 (Inter) 的上下文中使用 Function&lt;&gt;(在您的情况下,使用名为 func 的变量),您可以简单地将其设为 lambda 或方法引用:

Inter i2 = p -> func.apply(p);  // compiles

Inter i2 = func::apply;

【讨论】:

  • 好的,有没有办法将一种类型转换为另一种类型?
  • 抱歉,无法编译:方法 func(BigDecimal) 未定义
  • @user1151816 对不起,应该是func.apply(p),现在更正了。
  • @DodgyCodeException 我刚刚使用方法参考为您的答案添加了一个替代方案。
【解决方案2】:

我可以在这里看到 2 个功能接口(SAM), 第一个是Inter,第二个是由java提供的FunctionalInterface,它表示一个接受一个参数并产生结果的函数。

查看Inter i2 = func; 行,您在这里尝试做的是将一个功能接口分配给另一个功能接口,这在这里没有任何意义。

我已经修改了你的代码并引入了一个新的功能接口,希望这能帮助你并消除你的疑惑。

@FunctionalInterface
public interface Inter {
    BigDecimal method (BigDecimal param);
}

public static void main(String args[])
{
    Function<BigDecimal, BigDecimal> func = param -> BigDecimal.ZERO;

    Inter i1 = param -> BigDecimal.ZERO; // compile

    //creating new functional interface which returns Inter lambda body.
    Supplier<Inter> interSuppFuncInter = () -> { return param -> BigDecimal.ZERO; };

    Inter i2 = interSuppFuncInter.get(); // now compile's
    System.out.println(i2.method(BigDecimal.ZERO)); // invoke i2 lambda by calling its  method and passing the param
}

【讨论】:

    【解决方案3】:

    func 是一个Function&lt;BigDecimal, BigDecimal&gt;,它不是Inter 的子接口。因此它不能分配给Inter 变量。

    InterFunction&lt;BigDecimal, BigDecimal&gt; 都是具有相同签名的方法的函数式接口这一事实并不重要,因为它们不相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2017-03-19
      • 2018-05-02
      相关资源
      最近更新 更多