Подтвердить что ты не робот

Как назначить лямбда переменной в Java 8?

Просто играя с новыми лямбдами и функциональными функциями на Java 8, и я не уверен, как это сделать.

Например, допустимо следующее:

    Map<String, Integer> map = new HashMap<>();
    map.put("A", 1);
    map.put("B", 2);
    map.put("C", 3);
    map.compute("A", (k, v) -> v == null ? 42 : v + 41));

но следующее дает мне синтаксические ошибки:

    BiFunction x = (k, v) -> v == null ? 42 : v + 41;
    map.compute("A", x);

Любые идеи?

4b9b3361

Ответ 1

Вы забыли дженерики на своем BiFunction:

public static void main(final String[] args) throws Exception {
    final Map<String, Integer> map = new HashMap<>();
    map.put("A", 1);
    map.put("B", 2);
    map.put("C", 3);
    final BiFunction<String, Integer, Integer> remapper = (k, v) -> v == null ? 42 : v + 41;
    map.compute("A", remapper);
}

Продолжительность:

PS C:\Users\Boris> java -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b120)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b62, mixed mode)

Ответ 2

Как указывает Борис Паук, конкретная проблема, которую вы испытываете, - это дженерики. В зависимости от контекста добавление явного блока {} вокруг лямбда поможет добавить ясность и может потребоваться.

С этим вы получите что-то вроде:

BiFunction<String, Integer, Integer> x = (String k, Integer v) -> {v == null ? 42 : v + 41};

Это было бы очень полезно для будущих читателей, у которых такая же проблема, если вы разместили свои синтаксические ошибки, чтобы их можно было проиндексировать.

В этой ссылке есть дополнительные примеры, которые могут помочь.

Ответ 3

пример прохождения лямбда, содержащего метод

YourClass myObject = new YourClass();

// first parameter, second parameter and return 
BiFunction<String, YourClass, String> YourFunction; 

YourFunction = (k, v) -> v == null ? "ERROR your class object is null" : defaultHandler("hello",myObject);

public String defaultHandler(String message, YourClass Object)
{
     //TODO ...

     return "";
}