Как вы назначаете лямбда-переменную в 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);

Есть идеи?

3 ответа

Решение

Вы забыли дженерики на своем 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)

Пример передачи лямбда-выражения, содержащего метод

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

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

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

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

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

Эта ссылка имеет несколько дополнительных примеров, которые могут помочь.

Другие вопросы по тегам