【问题标题】:Equivalent for Python's lambda functions in Java?等效于 Java 中的 Python 的 lambda 函数?
【发布时间】:2010-10-30 02:55:47
【问题描述】:

谁能告诉我在 Java 中是否有 Python 的 lambda 函数的等价物?

【问题讨论】:

  • 值得庆幸的是,五年后,Java 8 添加了 lambda 表达式作为语言特性和新的 Streams API 用于处理批量数据操作。不完全理解,但仍然有用。

标签: java python function lambda


【解决方案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 行缺少一个括号。我尝试自己添加它,但 Stackoverflow 不允许我只修改 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 的接口。您可能也想检查一下。

          【讨论】:

            猜你喜欢
            • 2016-08-13
            • 1970-01-01
            • 2016-01-27
            • 2020-03-18
            • 2012-11-27
            • 2016-01-08
            • 2011-06-18
            • 2013-03-29
            相关资源
            最近更新 更多