具有多个参数的Java 8的Function.Function

Nai*_*per 7 java lambda java-8

我读了很多关于如何在Java 8中轻松定义lambda的例子.这个lambda总是有一个参数,如f1:

Function<Integer,Integer> f1 = (x) -> Math.pow(x,2);
Run Code Online (Sandbox Code Playgroud)

当然,你可以扩展身体像f2:

Function<Integer,Integer> f2 = (x) -> {if (x < 0)  return 0;
                                       else return Math.pow(x,2);};
Run Code Online (Sandbox Code Playgroud)

但我找不到一种方法来定义一个具有可变数量的参数的lambda,如f3:

Function<Integer,Integer,Integer> f3 = (x,y) -> {return x + y};
Run Code Online (Sandbox Code Playgroud)

或没有参数如f4:

Function<Double> f4 = () -> {return Math.random()};
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定,你可以定义自己的功能界面(即通常创建一个新的文件)制定f3f4,但有一些方法可以简单地定义呢?

Eug*_*ene 14

Function<Integer,Integer,Integer> f3 = (x,y) -> {return x + y};
Run Code Online (Sandbox Code Playgroud)

实际上是一个 BiFunction<Integer,Integer,Integer>

Function<Double> f4 = () -> {return Math.random()};
Run Code Online (Sandbox Code Playgroud)

是一个 Supplier<Double>

如果您需要更多创建自己的,TriFunction<Integer,Integer,Integer,Integer>例如

  • @Andreas我没有故意建议,我没有发现自己需要一个,所以不确定.谢谢你 (4认同)

dav*_*xxx 6

我几乎可以肯定你可以定义自己的功能接口(即通常创建一个新文件)来开发f3和f4,但有没有办法轻松定义它们?

除了尤金的答案,我还要补充一点:

Function<Integer,Integer,Integer> f3 = (x,y) -> {return x + y};
Run Code Online (Sandbox Code Playgroud)

可以被视为BiFunction<Integer,Integer,Integer>或简单BinaryOperator<Integer>.请注意,您使用Integerlambda主体中的s 执行算术计算.这些产生拆箱和装箱操作:Integer->int->Integer.所以在这个用例中,我们鼓励你使用一个专门的功能接口来阻止它:IntBinaryOperator功能签名(int, int)-> int本身就是BinaryOperator<T>一个子类的特化. BiFunction<T,T,T>

在保留自动装箱操作的同一逻辑中: Function<Integer,Integer> f2应该IntFunction f2 而且Supplier<Double> f4应该是DoubleSupplier f4.

还要注意,指定一个特定数量的参数是有意义的,因为它可以在lambda体中直接使用,但是指定类似var-args的东西是可能的,但通常更难以利用.

例如,您可以声明此接口:

@FunctionalInterface
public interface VargsFunction<T,R> {
    @SuppressWarnings("unchecked")
    R apply(T...  t);
}
Run Code Online (Sandbox Code Playgroud)

但是如果没有委托给接受var-args的方法,则更难使用:

VargsFunction<Integer, Integer> f = varg-> call(varg);

Integer call(Integer... varg) {
    ...
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*den 5

带有两个参数的函数是BiFunction

BiFunction<Integer, Integer, Integer> f3 = (x, y) -> x + y;
Run Code Online (Sandbox Code Playgroud)

不带参数的函数是Supplier

Supplier<Double> f4 = () -> Math.random();
Run Code Online (Sandbox Code Playgroud)

或等价:

Supplier<Double> f4 = Math::random;
Run Code Online (Sandbox Code Playgroud)