问题 Java 8:使用lambda表达式初始化HashMap


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

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

但是,当我尝试在体内使用lambda表达式时 put,我正在关注日食变换/错误。这就是我在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

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


7422
2018-06-28 14:07


起源

有趣的问题! +1 - fge
编译 javac。您确定为项目启用了Java 8吗? - axtavt
看起来你早于版本8编译了编译器 - Reimeus
我不确定Eclipse是否已完全更新 Java 8 然而。另外,请参阅 Java“双支撑初始化”的效率。 - Jeffrey
我现在已经检查过这个代码完全编译并在Eclipse上运行(4.4.1,一个1年前的版本),所以这似乎很可能是因为早期发布了Eclipse对Java 8的支持。 - Didier L


答案:


这可以从下载的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());
  }

}

6
2017-07-04 06:23





您正在做的正确,从Eclipse Project属性中的Java Build Path将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));

3
2017-09-02 05:46





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


0
2017-10-18 11:14