有人可以告诉我,如果在Java中有Python的lambda函数吗?
答案 0 :(得分:27)
不幸的是,在Java 8引入Lambda Expressions之前,Java中没有lambda。但是,您可以使用匿名类几乎同样的效果(以非常丑陋的方式):
interface MyLambda {
void theFunc(); // here we define the interface for the function
}
public class Something {
static void execute(MyLambda l) {
l.theFunc(); // this class just wants to use the lambda for something
}
}
public class Test {
static void main(String[] args) {
Something.execute(new MyLambda() { // here we create an anonymous class
void theFunc() { // implementing MyLambda
System.out.println("Hello world!");
}
});
}
}
显然,这些必须在单独的文件中:(
答案 1 :(得分:9)
我认为没有确切的等价物,但是有一些匿名类可以尽可能接近。但仍然非常不同。乔尔·斯波尔斯基(Joel Spolsky)写了一篇文章,讲述了学生如何只教Java,他们错过了这些功能风格编程的美学:Can Your Programming Language Do This?。
答案 2 :(得分:6)
一个想法是基于通用public interface Lambda<T>
- 请参阅http://www.javalobby.org/java/forums/t75427.html。
答案 3 :(得分:2)
是,
Lambda表达式是从java8中的java中引入的。
lambda表达式的基本语法是:
(parameters)->
{
statements;
}
实施例
(String s)->
{
System.out.println(s);
}
检查此链接:
http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
答案 4 :(得分:1)
与Zifre相似,你可以创建一个界面
public interface myLambda<In, Out> {
Out call(In i);
}
让你写,比如说
Function<MyObj, Boolean> func = new Function<MyObj, Boolean>() {
public Boolean callFor(myObj obj) {
return obj.canDoStuff();
};
MyObj thing = getThing;
if (func.callFor(thing)) {
doSomeStuff();
} else {
doOtherStuff();
}
它仍然有点kludgy,是的,但它至少有输入/输出。
答案 5 :(得分:1)
随着 Java 8 的发布,lambda-expression现已推出。 并且java中的lambda函数实际上是#34;更强大&#34;而不是蟒蛇。
在Python中,lambda-expression可能只有一个表达式,而且不允许使用return
语句。在Java中,您可以执行以下操作:(int a, int b) -> { return a * b; };
以及其他可选项。
Java 8还引入了另一个名为Function Interface
的接口。您可能也想检查一下。
答案 6 :(得分:0)
正如已经指出的那样,lambda表达式是在Java 8中引入的。
如果您来自python,C#或C ++,请参阅Adrian D. Finlay的excellent example,我个人认为它比official documentation更容易理解。
这是基于Adrian的示例的快速浏览,该示例使用带有Python内核和IJava java kernel的jupyter笔记本创建。
Python:
# lambda functions
add = lambda x, y : x + y
multiply = lambda x, y : x * y
# normal function. In python, this is also an object.
def add_and_print_inputs(x, y):
print("add_and_print inputs : {} {}".format(x,y))
return x + y
print(add(3,5), multiply(3,5), add_and_print_inputs(3,5))
输出:
add_and_print inputs : 3 5
8 15 8
Java lambda函数可以是多行的,而在python中,它们是单个语句。但是,这里没有优势。在python中,常规函数也是对象。可以将它们作为参数添加到任何其他函数中。
# function that takes a normal or lambda function (myfunc) as a parameter
def double_result(x,y,myfunc):
return myfunc(x,y) * 2
double_result(3,5,add_and_print_inputs)
输出:
add_and_print inputs : 3 5
16
Java:
// functional interface with one method
interface MathOp{
int binaryMathOp(int x, int y);
}
// lambda functions
MathOp add = (int x, int y) -> x + y;
MathOp multiply = (int x, int y) -> x * y;
// multiline lambda function
MathOp add_and_print_inputs = (int x, int y) -> {
System.out.println("inputs : " + x + " " + y);
return x + y;};// <- don't forget the semicolon
// usage
System.out.print("" +
add.binaryMathOp(3,5) + " " +
multiply.binaryMathOp(3,5) + " " +
add_and_print_inputs.binaryMathOp(3,5))
输出:
inputs : 3 5
8 15 8
当用作参数时:
// function that takes a function as a parameter
int doubleResult(int x, int y, MathOp myfunc){
return myfunc.binaryMathOp(x,y) * 2;
}
doubleResult(3,5,add_and_print_inputs)
输出:
inputs : 3 5
16