在Java中用Python的lambda函数等效?

时间:2009-05-30 15:49:18

标签: java python function lambda

有人可以告诉我,如果在Java中有Python的lambda函数吗?

7 个答案:

答案 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