Java 8: инициализация HashMap с помощью лямбда-выражений

Я пытаюсь объявить и определить большую хэш-карту сразу. Вот как я это делаю:

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

Но, когда я пытаюсь использовать лямбда-выражения в теле put, я нажимаю на warlning/error eclipse. Вот как я использую лямбда в HashMap:

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

Eclipse подчеркивает всю часть лямбда, начиная с запятой. Сообщения об ошибках:

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

Кто-нибудь знает, что я делаю неправильно? Является ли инициализация лямбда-выражением допустимой в 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

Вы делаете правильно, обновляете JDK-библиотеку до версии 1.8 из Java Build Path в свойствах проекта Eclipse.

Я только что попробовал приведенный ниже код, и он отлично работает на моем 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), поэтому я переключился на Netbeans. Если вы установили более раннюю версию Netbeans, убедитесь, что ПОЛНОСТЬЮ удалите ее, чтобы убедиться, что новый не может ссылаться на старые Logfiles и т.д.