在Java 8,方法可被创建为Lambda表达式,并且可以通过引用传递(与引擎盖下一点的工作)。 有很多的例子在线与正在创建和使用方法使用lambda表达式,但不知道如何使服用lambda作为参数的方法的例子。 什么是的语法?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
Answer 1:
Lambda表达式是纯粹的调用点构造:拉姆达的接收方不需要知道了lambda参与,而是接受用适当的方法的接口。
换句话说,您定义或使用接受并返回正是你想要的功能接口(即具有单一方法的接口)。
对于这个Java 8附带了一组常用的接口类型java.util.function
(感谢莫里斯·纳夫特尔林有关的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);
}
使用自己的接口的优点是你可以有名字更清楚地表明意图。
Answer 2:
要使用你需要创建自己的功能接口或使用Java功能的接口需要两个整数运算和返回值作为Lambda表达式。 IntBinaryOperator
使用用户定义的功能的接口
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));
}
}
使用Java功能接口
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));
}
}
我创建了其它的例子就是在这里
Answer 3:
对于不具有超过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>
是它的返回类型。
对于只有一个参数的函数,可以使用Function<T, R>
其中T
是它的参数的类型,和R
是其返回值的类型。 请参阅本页面对于所有这些被Java已经提供的接口。
Answer 4:
还有的LAMBDA启用的Java 8 JavaDoc中,从连接的公共网络访问的版本http://lambdafaq.org/lambda-resources 。 (这显然应该是对约阿希姆·绍尔的答案评论,但我不能进入我与我需要添加注释的声誉点SO帐户。)的lambdafaq网站(我维护它)回答了这个和许多其他的Java -Lambda问题。
在Java 8 GA文档成为前NB这个答案写公开可用 。 我留在原地,虽然,因为LAMBDA常见问题可能仍然是人们学习有关使用Java 8中引入的功能非常有用。
Answer 5:
Lambda表达式可以被传递作为argument.To传递lambda表达式作为参数(其接收λ表达式作为参数)的参数的类型必须是功能性的接口类型。
如果有一个功能界面 -
interface IMyFunc {
boolean test(int num);
}
还有就是它增加了int类型列表中,只有当它大于5。注意这里过滤方法有泛函接口IMyFunc作为参数之一的过滤方法。 在这种情况下λ表达式可以作为用于该方法的参数的参数传递。
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);
}
}
Answer 6:
对于任何人谁是谷歌搜索这一点,一个好的方法是使用java.util.function.BiConsumer
。 例如:
Import java.util.function.Consumer
public Class Main {
public static void runLambda(BiConsumer<Integer, Integer> lambda) {
lambda.accept(102, 54)
}
public static void main(String[] args) {
runLambda((int1, int2) -> System.out.println(int1 + " + " + int2 + " = " + (int1 + int2)));
}
该outprint将是:166
Answer 7:
对我来说,最有意义的解决方案是定义一个Callback
接口:
interface Callback {
void call();
}
然后用它作为函数的参数要拨打:
void somewhereInYourCode() {
method(() -> {
// You've passed a lambda!
// method() is done, do whatever you want here.
});
}
void method(Callback callback) {
// Do what you have to do
// ...
// Don't forget to notify the caller once you're done
callback.call();
}
只是虽然精度
一个lambda不是一个特殊的接口,类或其他任何东西,你可以自己申报。 Lambda
只是赋予的名称() -> {}
特殊语法,这允许更好的可读性传递单方法接口作为参数时。 它被设计用来替换此:
method(new Callback() {
@Override
public void call() {
// Classic interface implementation, lot of useless boilerplate code.
// method() is done, do whatever you want here.
}
});
所以在上面的例子中, Callback
是不是一个拉姆达,这只是一个普通的接口; lambda
是你可以用它来实现它的快捷语法的名字。
Answer 8:
嗯,这很容易。 lambda表达式的目的是执行功能接口。 这是一个只有一个方法的接口。 下面是有关预定义和传统功能接口awesone文章。
无论如何,如果你想实现自己的功能界面,使之。 只是简单的例子:
public interface MyFunctionalInterface {
String makeIt(String s);
}
因此,让一个班,在那里我们将创建一个方法,它接受MyFunctionalInterface的类型:
public class Main {
static void printIt(String s, MyFunctionalInterface f) {
System.out.println(f.makeIt(s));
}
public static void main(String[] args) {
}
}
你应该做的最后一件事是传递MyFunctionalInterface到我们定义的方法的实现:
public class Main {
static void printIt(String s, MyFunctionalInterface f) {
System.out.println(f.makeIt(s));
}
public static void main(String[] args) {
printIt("Java", s -> s + " is Awesome");
}
}
而已!
Answer 9:
LAMBDA不是一个对象,而是一个功能接口。 可以定义多达功能接口,因为他们可以使用@FuntionalInterface作为注解
@FuntionalInterface
public interface SumLambdaExpression {
public int do(int a, int b);
}
public class MyClass {
public static void main(String [] args) {
SumLambdaExpression s = (a,b)->a+b;
lambdaArgFunction(s);
}
public static void lambdaArgFunction(SumLambdaExpression s) {
System.out.println("Output : "+s.do(2,5));
}
}
输出将是如下
Output : 7
lambda表达式的基本概念是定义你自己的逻辑,但已定义的参数。 所以在上面的代码中,你可以改变的除了任何其他定义DO功能的定义,但你的论点被限制为2。
Answer 10:
请执行下列操作 ..
您已声明method(lambda l)
所有你想要做的就是创建一个接口名为lambda
并宣布一个抽象方法
public int add(int a,int b);
方法名称并不重要这里..
所以,当u调用MyClass.method( (a,b)->a+b)
此实现(a,b)->a+b
将被注入到你的界面添加方法。所以,只要你拨打l.add
这是怎么回事借此实现和执行加法的a
和b
和return l.add(2,3)
将返回5
。 - 基本上,这是拉姆达呢..
Answer 11:
有一个在使用lambda作为参数的灵活性。 它能够在Java函数式编程。 基本语法
参数:param - > method_body
以下是一个方法,你可以定义服用功能接口(拉姆达使用)作为参数的方法。 一个。 如果你希望定义一个功能接口内声明的方法,比方说,所述功能接口被指定作为参数/参数的方法从被称为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) - > {返回0; };
funcUsesAnonymousOrLambda(FI);
这里它上面可以看出,如何lambda表达式可以与一个界面来代替。
以上介绍了lambda表达式的特定用途,还有更多。 REF 的λ内的Java 8的λ不能修改从外的λ可变
文章来源: How do I define a method which takes a lambda as a parameter in Java 8?