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)
我几乎可以肯定,你可以定义自己的功能界面(即通常创建一个新的文件)制定f3和f4,但有一些方法可以简单地定义呢?
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>例如
我几乎可以肯定你可以定义自己的功能接口(即通常创建一个新文件)来开发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)
带有两个参数的函数是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)
| 归档时间: |
|
| 查看次数: |
4055 次 |
| 最近记录: |