【发布时间】:2010-10-30 02:55:47
【问题描述】:
谁能告诉我在 Java 中是否有 Python 的 lambda 函数的等价物?
【问题讨论】:
-
值得庆幸的是,五年后,Java 8 添加了 lambda 表达式作为语言特性和新的 Streams API 用于处理批量数据操作。不完全理解,但仍然有用。
标签: java python function lambda
谁能告诉我在 Java 中是否有 Python 的 lambda 函数的等价物?
【问题讨论】:
标签: java python function lambda
不幸的是,在 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!");
}
});
}
}
显然这些必须在单独的文件中:(
【讨论】:
MyLambda 不必在不同的文件中;您可以将其声明为 Something 的内部、公共、静态接口。
我不认为有一个完全等价的,但是有一些匿名类是尽可能接近的。但还是很不一样。 Joel Spolsky 写了一篇文章,讲述了只教 Java 的学生如何错过了函数式编程的这些美:Can Your Programming Language Do This?。
【讨论】:
一个想法是基于一个通用的public interface Lambda<T>——见http://www.javalobby.org/java/forums/t75427.html。
【讨论】:
是的,
Lambda 表达式是从 java8 开始在 java 中引入的。
lambda 表达式的基本语法是:
(parameters)->
{
statements;
}
例子
(String s)->
{
System.out.println(s);
}
查看此链接:
http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
【讨论】:
正如已经指出的,lambda 表达式是在 Java 8 中引入的。
如果您来自 python、C# 或 C++,请参阅 Adrian D. Finlay 的 excellent example,我个人认为它比 official documentation 更容易理解。
这是基于 Adrian 示例的快速浏览,它使用带有 python 内核和 IJava java kernel 的 jupyter notebook 创建。
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
【讨论】:
有点类似于 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();
}
它仍然有点笨拙,是的,但它至少有输入/输出。
【讨论】:
随着 Java 8 的发布,现在可以使用 lambda-expression。 而且java中的lambda函数实际上比python的“更强大”。
在 Python 中,lambda-expression 的主体可能只有一个表达式,并且不允许使用 return 语句。在 Java 中,您可以执行以下操作:(int a, int b) -> { return a * b; }; 以及其他可选操作。
Java 8 还引入了另一个名为Function Interface 的接口。您可能也想检查一下。
【讨论】: