【问题标题】:Java 8: HashMap initialization with lambda expressionsJava 8:使用 lambda 表达式初始化 HashMap
【发布时间】:2013-06-28 14:07:48
【问题描述】:

我正在尝试一次声明和定义更大的哈希映射。我就是这样做的:

public HashMap<Integer, Callable<String>> opcode_only = new HashMap<Integer, Callable<String>>() {{
    put(x, y);
    put(x, y);
}};

但是,当我尝试在 put 的正文中使用 lambda 表达式时,我遇到了 eclipse 警告/错误。这就是我在 HashMap 中使用 lambda 的方式:

public HashMap<Integer, Callable<String>> opcode_only = new HashMap<Integer, Callable<String>>() {{
    put(0, () -> { return "nop"; });
    put(1, () -> { return "nothing...."; });
}};

Eclipse 强调了 lambda 的整个部分,之前以逗号开头。 错误信息:

Syntax error on token ",", Name expected    
Syntax error on tokens, Expression expected instead

有人知道我做错了什么吗? HashMap 中是否允许通过 lambda 表达式进行初始化?请帮忙。

【问题讨论】:

  • 有趣的问题! +1
  • javac 中编译。您确定为您的项目启用了 Java 8 吗?
  • 看起来您正在使用版本 8 之前的编译器进行编译
  • 我不确定 Eclipse 是否已针对 Java 8 进行了全面更新。另请参阅Efficiency of Java “Double Brace Initialization”
  • 我现在已经检查了这段代码在 Eclipse(4.4.1,一个 1 年前的版本)上完美编译和运行,所以这似乎很可能是一个问题,因为 Eclipse 的早期版本支持Java 8.

标签: java collections lambda hashmap java-8


【解决方案1】:

这在从以下位置下载的 Netbeans Lamba 构建中运行良好:http://bertram2.netbeans.org:8080/job/jdk8lambda/lastSuccessfulBuild/artifact/nbbuild/

import java.util.*;
import java.util.concurrent.Callable;

public class StackoverFlowQuery {

  public static void main(String[] args) throws Exception {

    HashMap<Integer, Callable<String>> opcode_only = 
          new HashMap<Integer, Callable<String>>() {
            {
              put(0, () -> {
                return "nop";
              });
              put(1, () -> {
                return "nothing....";
              });
            }
          };
    System.out.println(opcode_only.get(0).call());
  }

}

【讨论】:

    【解决方案2】:

    您做得对,将 JDK 库从 Eclipse 项目属性中的 Java 构建路径更新到 1.8 版本。

    我刚刚尝试了以下代码,它在我的 Eclipse 上运行良好:

            HashMap<Integer, Integer> hmLambda = new HashMap<Integer, Integer>() {
            {
                put(0, 1);
                put(1, 1);
            }
        };
        System.out.println(hmLambda.get(0));
    
        hmLambda.forEach((k, v) -> System.out.println("Key " + k
                + " and Values is: " + v));
    

    【讨论】:

      【解决方案3】:

      据我所知,Netbeans 7.4 完全支持 Java 8。我遇到了 eclipse 的问题(atm 它不支持 java8,所以它只能编译 7 的旧 Lambda 表达式),这就是我切换到 Netbeans 的原因。如果您安装了较早版本的 Netbeans,请确保完全卸载它,以确保新版本无法引用旧的日志文件等。

      【讨论】:

        猜你喜欢
        • 2021-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        • 1970-01-01
        • 1970-01-01
        • 2015-10-12
        • 2018-01-14
        相关资源
        最近更新 更多