等效于 Java 中的 Python 的 lambda 函数?
Posted
技术标签:
【中文标题】等效于 Java 中的 Python 的 lambda 函数?【英文标题】:Equivalent for Python's lambda functions in Java? 【发布时间】:2010-10-30 02:55:47 【问题描述】:谁能告诉我在 Java 中是否有 Python 的 lambda 函数的等价物?
【问题讨论】:
值得庆幸的是,五年后,Java 8 添加了 lambda 表达式作为语言特性和新的 Streams API 用于处理批量数据操作。不完全理解,但仍然有用。 看看这个:Are Java 8 Lambdas Closures? 【参考方案1】:不幸的是,在 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!");
);
显然这些必须在单独的文件中:(
【讨论】:
Lambda 可以接受并将返回一个值。你想要更像 Callable 的东西。 除了能够接受参数和返回值之外,lambdas 还可以在它们定义的范围内访问局部变量。在 Java 中,匿名类可以在定义它们的范围内访问 final 变量,这已经足够相似了。 OTOH,Something 实现 Callable 可能是个好主意。 一个小问题:MyLambda
不必在不同的文件中;您可以将其声明为 Something
的内部、公共、静态接口。
总是有 Jython... :) 而Nice 是另一种模拟 Java 的语言,但添加了此功能...
您能否在考虑到 java 8 的情况下更新答案?【参考方案2】:
我不认为有一个完全等价的,但是有一些匿名类是尽可能接近的。但还是很不一样。 Joel Spolsky 写了一篇文章,讲述了只教 Java 的学生如何错过了函数式编程的这些美:Can Your Programming Language Do This?。
【讨论】:
【参考方案3】:一个想法是基于一个通用的public interface Lambda<T>
——见http://www.javalobby.org/java/forums/t75427.html。
【讨论】:
【参考方案4】:是的,
Lambda 表达式是从 java8 开始在 java 中引入的。
lambda 表达式的基本语法是:
(parameters)->
statements;
例子
(String s)->
System.out.println(s);
查看此链接:
http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
【讨论】:
【参考方案5】:正如已经指出的,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
【讨论】:
【参考方案6】:有点类似于 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();
它仍然有点笨拙,是的,但它至少有输入/输出。
【讨论】:
我认为您在第二个代码 sn-p 的第 5 行缺少一个括号。我尝试自己添加它,但 *** 不允许我只修改 1 个字符的长度。【参考方案7】:随着 Java 8 的发布,现在可以使用 lambda-expression。 而且java中的lambda函数实际上比python的“更强大”。
在 Python 中,lambda-expression 的主体可能只有一个表达式,并且不允许使用 return
语句。在 Java 中,您可以执行以下操作:(int a, int b) -> return a * b; ;
以及其他可选操作。
Java 8 还引入了另一个名为Function Interface
的接口。您可能也想检查一下。
【讨论】:
以上是关于等效于 Java 中的 Python 的 lambda 函数?的主要内容,如果未能解决你的问题,请参考以下文章
等效于 Javascript 中的 python 范围 [重复]
等效于 Java 8 中的 Scala 的 foldLeft