Эквивалент для лямбда-функций Python в Java? - PullRequest
22 голосов
/ 30 мая 2009

Может кто-нибудь сказать мне, если есть эквивалент лямбда-функций Python в Java?

Ответы [ 7 ]

27 голосов
/ 30 мая 2009

К сожалению, в Java нет лямбд, пока Java 8 не представила Лямбда-выражения . Тем не менее, вы можете получить почти такой же эффект (очень уродливо) с анонимными классами:

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!");
            }
        });
    }
}

Очевидно, что они должны быть в отдельных файлах: (

9 голосов
/ 30 мая 2009

Я не думаю, что есть точный эквивалент, однако есть анонимные классы, которые настолько близки, насколько вы можете получить. Но все еще довольно разные. Джоэл Спольски написал статью о том, как студенты, обучающие только Java, упускают из виду эти прелести функционального стиля программирования: Может ли ваш язык программирования сделать это? .

6 голосов
/ 30 мая 2009

Одна идея основана на обобщенном public interface Lambda<T> - см. http://www.javalobby.org/java/forums/t75427.html.

2 голосов
/ 09 марта 2015

Да,

Лямбда-выражения вводятся в java из java8.

Основной синтаксис для лямбда-выражений:

(parameters)->
{
  statements;
}

Пример

(String s)->
{
System.out.println(s);
}

Проверьте эту ссылку:

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

1 голос
/ 14 декабря 2016

С выпуском Java 8 теперь доступно лямбда-выражение. И лямбда-функция в Java на самом деле «более мощная», чем функции Python.

В Python лямбда-выражение может иметь только одно выражение для своего тела, и оператор return не допускается. В Java вы можете сделать что-то вроде этого: (int a, int b) -> { return a * b; }; и другие дополнительные функции.

Java 8 также представляет другой интерфейс, называемый Function Interface. Возможно, вы захотите это проверить.

1 голос
/ 16 июня 2010

Примерно так же, как у 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();
}

Да, все еще немного глупо, но, по крайней мере, у него есть вход / выход.

0 голосов
/ 06 ноября 2018

Как уже указывалось, лямбда-выражения были введены в Java 8.

Если вы работаете с python, C # или C ++, см. отличный пример Адриана Д. Финлая, который лично мне показался намного более понятным, чем официальная документация .

Вот быстрый взгляд на пример Адриана, созданный с использованием блокнота jupyter с ядром python и ядром Java IJava .

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 могут быть многострочными, тогда как в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...