【问题标题】:How do you assign a lambda to a variable in Java 8?在 Java 8 中,如何将 lambda 赋值给变量?
【发布时间】:2014-02-20 21:31:30
【问题描述】:

只是在使用 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);

有什么想法吗?

【问题讨论】:

  • 请贴出实际的语法错误。

标签: java lambda java-8


【解决方案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)

【讨论】:

  • 酷。我明白了——我需要非常明确地说明这一点。当您在查看 map.compute 方法时查看参数类型时,它仅将其显示为 BiFunction。
  • Java 8 类型推断与以前的版本相比有了显着改进,您仍然需要在表达式的开头指定泛型类型以供编译器使用。如果您查看Javadoc for Map,您可以看到所需的类型。
  • 请注意,“final”不是必需的。没有它,它编译得很好。不确定这是错误还是功能。
  • @sproketboy 在以前的 Java 版本中 final 是在匿名类中可访问的局部变量所必需的。在 Java 8 中,这已经改变,现在的要求是变量是“有效最终的”,即如果编译器确定变量没有被重新分配。所以功能...
  • 您的示例没有在 AIC 或 lambda 中使用重映射器,因此它甚至不需要有效地最终确定。您可以从声明中删除 final 并稍后将重新映射器重新分配给其他东西,它仍然可以工作。
【解决方案2】:

正如 Boris The Spider 所指出的,您遇到的具体问题是泛型。根据上下文,在 lambda 周围添加显式 {} 块将有助于增加清晰度,并且可能是必需的。

这样,你会得到类似的东西:

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

如果您发布语法错误以便将它们编入索引,这对于未来遇到相同问题的读者将非常有帮助。

This link 有一些其他示例可能会有所帮助。

【讨论】:

  • 这不太正确 - 请参阅我的回答。 BiFunction 接受 3 种类型的参数。
【解决方案3】:

传递包含方法的 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 "";
}

【讨论】:

    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多