Java 8: 使用Lambda表达式初始化HashMap

15
我试图一次性声明和定义大型哈希表,具体做法如下:
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吗? - axtavt
看起来你正在使用早于8版本的编译器进行编译。 - Reimeus
我不确定Eclipse是否已经完全更新到Java 8。此外,请参阅Java“双括号初始化”的效率 - Jeffrey
嗯,那只是Eclipse的问题吗?手动编译时会起作用吗? - user35443
如果您正在寻找如何使用lambda声明一个完全填充的HashMap字段,请参考此问题和答案:如何使用lambda初始化map? - Mike Nakis
1
我现在已经检查过这段代码,在 Eclipse(4.4.1,一年前发布的版本)上可以完美编译和运行,因此这似乎很可能是因为 Eclipse 对 Java 8 的支持还处于早期版本导致的问题。 - Didier L
3个回答

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

}

4

您做得很正确,从Eclipse项目属性的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));

0
据我所知,Netbeans 7.4完全支持Java 8。我在使用eclipse时遇到了问题(目前它不支持java8,因此只能编译旧的Lambda表达式7),这就是为什么我转向了Netbeans。如果您安装了早期版本的Netbeans,请确保完全卸载它,以确保新版本无法引用旧的日志文件等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接