Java 8:使用 lambda 表达式进行 HashMap 初始化

2022-09-03 15:24:02

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

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

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

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

有谁知道我做错了什么?是否允许使用 lambda 表达式进行初始化?请帮忙。HashMap


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

您做对了,从 Eclipse 项目属性中的 Java 构建路径将 JDK 库更新到 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));