等效于 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) -&gt; return a * b; ; 以及其他可选操作。

Java 8 还引入了另一个名为Function Interface 的接口。您可能也想检查一下。

【讨论】:

以上是关于等效于 Java 中的 Python 的 lambda 函数?的主要内容,如果未能解决你的问题,请参考以下文章

python中的GNU拆分等效于啥? [复制]

等效于 Javascript 中的 python 范围 [重复]

等效于 Java 8 中的 Scala 的 foldLeft

C# 等效于 Java 中的 class.forName() [重复]

C# 等效于 Java 标点正则表达式

Java 等效于 C# Linq 中的 Where 子句