Pytanie Java 8: inicjalizacja HashMap z wyrażeń lambda


Próbuję zadeklarować i zdefiniować większą mapę skrótu na raz. Tak to robię:

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

Ale kiedy próbuję użyć wyrażeń lambda w ciele put, Trafiam na warrning / error zaćmienia. W ten sposób używam lambda w HashMap:

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

Eclipse podkreśla całą część lambda zaczynając od przecinka wcześniej. Komunikaty o błędach:

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

Czy ktoś wie, co robię źle? Inicjalizacja poprzez dopuszczenie wyrażenia lambda w HashMap? Proszę pomóż.


11
2018-06-28 14:07


pochodzenie


Interesujące pytanie! +1 - fge
Kompiluje się javac. Czy jesteś pewien, że Java 8 jest włączona dla twojego projektu? - axtavt
Wygląda na to, że kompilujesz kompilator wcześniej niż w wersji 8 - Reimeus
Nie jestem pewien, czy Eclipse jest w pełni zaktualizowany Java 8 jeszcze. Zobacz także Wydajność Java "Inicjalizacja Double Brace". - Jeffrey
Sprawdziłem, czy ten kod doskonale się kompiluje i działa w Eclipse (4.4.1, wydanie 1-letnie), więc wydaje się, że jest to najprawdopodobniej problem związany z wczesnym wydaniem obsługi Eclipse dla Java 8. - Didier L


Odpowiedzi:


Działa to dobrze w kompilacjach Netbeans Lamba pobranych z: 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





Robisz poprawne, zaktualizuj bibliotekę JDK do wersji 1.8 ze ścieżki budowania Java we właściwościach projektu Eclipse.

Właśnie wypróbowałem poniższy kod i działa poprawnie na moim 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





O ile wiem, Netbeans 7.4 w pełni obsługuje Javę 8. Miałem problemy z eclipse (atm nie obsługuje java8, więc jest w stanie skompilować stare wyrażenia Lambda z 7), dlatego przełączyłem się na Netbeans. Jeśli masz zainstalowaną wcześniejszą wersję Netbeans, pamiętaj o jej całkowitym odinstalowaniu, aby upewnić się, że nowsza wersja nie jest w stanie odnosić się do starych Logfiles itp.


0
2017-10-18 11:14