如何定义一个在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>>
, Integer
和String
是它的参数, 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