【问题标题】:Chaining Functional Interfaces - IntUnaryOperator vs UnaryOperator链接功能接口 - IntUnaryOperator 与 UnaryOperator
【发布时间】:2017-08-17 07:16:46
【问题描述】:

我还在学习函数式接口。我想知道为什么我可以将UnaryOperator 链接到Function 的末尾,但不能将IntUnaryOperator 链接到同一函数的末尾。

UnaryOperator <String> twoOfMe = s -> s + s;
Function <String, Integer> convertMe = s -> Integer.parseInt (s);

UnaryOperator <Integer> twiceMe = n -> 2*n;

IntUnaryOperator doubleMe = n -> 2*n;

int a = twoOfMe.andThen(convertMe).andThen(twiceMe).apply ("2");

int b = twoOfMe.andThen(convertMe).andThen(doubleMe).apply ("2");

int a 可与 twiceMe 一起使用,但 int b 不适用于 doubleMe

谢谢

编辑: 它说不兼容的类型。必需的整数。找到 java.lang.Object

【问题讨论】:

  • “不起作用”是什么意思?例外 ?警告 ?不是预期的结果?
  • 只是因为 andThen() 将 Function 作为参数,而 UnaryOperator 扩展了 Function,但 IntUnaryOperator 没有。

标签: java lambda unary-operator


【解决方案1】:

andThen(Function&lt;? super R, ? extends V&gt; after) 需要 Function 参数。 UnaryOperator&lt;Integer&gt;Function&lt;Integer,Integer&gt; 的子接口,匹配。 IntUnaryOperatorFunction 接口无关,所以doubleMe 不能传递给andThen

【讨论】:

  • 如此简单。很有帮助。谢谢。
【解决方案2】:

这是因为IntUnaryOperatorint 映射到int,而函数&lt;String, Integer&gt; convertMe 返回的是Integer,而不是int。你不能把它们锁起来。

你可以声明ToIntFunction&lt;String&gt; convertMe = Integer::parseInt;,然后你可以链接它们。

UnaryOperator<String> twoOfMe = s -> s + s;
ToIntFunction<String> convertMe = Integer::parseInt;
IntUnaryOperator doubleMe = n -> 2*n;
int b = twoOfMe.andThen(convertMe).andThen(doubleMe).apply ("2");

【讨论】:

    【解决方案3】:

    如果您查看IntUnaryOperator 类,您会发现它没有扩展任何接口,而另一方面UnaryOperator 确实扩展了Function 接口。

    您提供的代码不适用于IntUnaryOperator,因为它需要Function,这不是IntUnaryOperator 的真正含义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      相关资源
      最近更新 更多