如何定义一个在Java 8中将lambda作为参数的方法?

在Java 8中,方法可以创build为Lambdaexpression式,并且可以通过引用传递(在引擎下进行一些工作)。 在线创build和使用lambdaexpression式的例子很多,但没有例子说明如何创build一个以lambda为参数的方法。 这是什么语法?

MyClass.method((a, b) -> a+b); class MyClass{ //How do I define this method? static int method(Lambda l){ return l(5, 10); } } 

Lambda完全是一个调用站点构造:lambda的接收者不需要知道涉及到Lambda,而是使用适当的方法接受接口。

换句话说,你可以定义或使用一个function接口(即一个单一方法的接口),它接受和返回你想要的。

为此,Java 8在java.util.function提供了一组常用的接口types(感谢Maurice Naftalin提供有关JavaDoc的提示)。

对于这个特定的用例, java.util.function.IntBinaryOperator带有一个int applyAsInt(int left, int right)方法 ,所以你可以这样写你的method

 static int method(IntBinaryOperator op){ return op.applyAsInt(5, 10); } 

但是你也可以定义你自己的接口并像这样使用它:

 public interface TwoArgIntOperator { public int op(int a, int b); } //elsewhere: static int method(TwoArgIntOperator operator) { return operator.op(5, 10); } 

使用自己的界面的优点是,你可以有更清楚地表明意图的名称。

要使用Lambdaexpression式,您需要创build您自己的函数接口或使用Java函数接口进行操作,需要两个整数并将其作为值返回。 IntBinaryOperator

使用用户定义的function界面

 interface TwoArgInterface { public int operation(int a, int b); } public class MyClass { public static void main(String javalatte[]) { // this is lambda expression TwoArgInterface plusOperation = (a, b) -> a + b; System.out.println("Sum of 10,34 : " + plusOperation.operation(10, 34)); } } 

使用Javafunction界面

 import java.util.function.IntBinaryOperator; public class MyClass1 { static void main(String javalatte[]) { // this is lambda expression IntBinaryOperator plusOperation = (a, b) -> a + b; System.out.println("Sum of 10,34 : " + plusOperation.applyAsInt(10, 34)); } } 

我创build的其他例子就在这里

对于没有超过2个参数的函数,可以在不定义自己的接口的情况下通过它们。 例如,

 class Klass { static List<String> foo(Integer a, String b) { ... } } class MyClass{ static List<String> method(BiFunction<Integer, String, List<String>> fn){ return fn.apply(5, "FooBar"); } } List<String> lStr = MyClass.method((a, b) -> Klass.foo((Integer) a, (String) b)); 

BiFunction<Integer, String, List<String>>IntegerString是它的参数, List<String>是它的返回types。

对于只有一个参数的函数,可以使用Function<T, R> ,其中T是它的参数types, R是它的返回值types。 有关Java已经提供的所有接口,请参阅此页面 。

http://lambdafaq.org/lambda-resources链接了一个支持Lambda的Java 8 JavaDocs的公共Web可访问版本。 (这显然应该是对Joachim Sauer的回答的一个评论,但我不能进入我的SO帐户,我需要添加注释的声誉点。)lambdafaq网站(我维护它)回答这个和其他许多Java – 兰达问题。

Lambdaexpression式可以作为parameter passing。要传递一个lambdaexpression式作为参数,参数(接收lambdaexpression式作为参数)的types必须是函数接口types。

如果有一个function界面 –

 interface IMyFunc { boolean test(int num); } 

并且有一个filter方法,只有当列表中的int大于5时才会添加int。注意这里的filter方法具有function接口IMyFunc作为参数之一。 在这种情况下,lambdaexpression式可以作为parameter passing给方法参数。

 public class LambdaDemo { public static List<Integer> filter(IMyFunc testNum, List<Integer> listItems) { List<Integer> result = new ArrayList<Integer>(); for(Integer item: listItems) { if(testNum.test(item)) { result.add(item); } } return result; } public static void main(String[] args) { List<Integer> myList = new ArrayList<Integer>(); myList.add(1); myList.add(4); myList.add(6); myList.add(7); // calling filter method with a lambda expression // as one of the param Collection<Integer> values = filter(n -> n > 5, myList); System.out.println("Filtered values " + values); } } 

使用lambda作为参数是灵活的。 它使Java中的function编程。 基本的语法是

param – > method_body

以下是一种方法,您可以定义一个以function接口(lambda使用)作为参数的方法。 一个。 如果你想定义一个在函数接口中声明的方法,比如说, 函数接口作为一个参数/参数被赋予一个从main()调用的方法。

 @FunctionalInterface interface FInterface{ int callMeLambda(String temp); } class ConcreteClass{ void funcUsesAnonymousOrLambda(FInterface fi){ System.out.println("===Executing method arg instantiated with Lambda===")); } public static void main(){ // calls a method having FInterface as an argument. funcUsesAnonymousOrLambda(new FInterface() { int callMeLambda(String temp){ //define callMeLambda(){} here.. return 0; } } } /***********Can be replaced by Lambda below*********/ funcUsesAnonymousOrLambda( (x) -> { return 0; //(1) } } 

FInterface fi =(x) – > {return 0; };

funcUsesAnonymousOrLambda(FI);

在这里可以看到,一个lambdaexpression式如何被一个接口replace。

上面解释了lambdaexpression式的一个特定用法,还有更多。 ref lambda中的Java 8 lambda不能修改来自外部lambda的variables