如何在Java 8中为变量分配lambda?

时间:2014-02-20 21:31:30

标签: java lambda java-8

只是在Java 8中使用新的lambda和功能,我不知道如何做到这一点。

例如,以下内容有效:

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

答案 0 :(得分:39)

您忘记了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)

答案 1 :(得分:3)

正如鲍里斯蜘蛛所指出的那样,你遇到的具体问题是仿制药。根据上下文,在lambda周围添加一个显式的{}块将有助于增加清晰度,可能是必需的。

有了这个,你会得到类似的东西:

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

如果您发布了语法错误,那么对于具有相同问题的未来读者来说,这将非常有用,因此可以将它们编入索引。

This link还有一些其他可能有用的示例。

答案 2 :(得分:2)

传递包含方法

的lambda的示例
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 "";
}