2013-06-28 19 views
11

Próbuję zadeklarować i zdefiniować większą mapę skrótu na raz. Oto jak to zrobić:Java 8: Inicjalizacja HashMap z wyrażeń lambda

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

Ale gdy próbuję użyć wyrażenia lambda w ciele put, mam trafienia na zaćmienie warrning/błędu. 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 przed. Komunikaty o błędach:

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

czy ktoś wie co robię źle? Czy inicjalizacja przez wyrażenie lambda jest dozwolona w HashMap? Proszę pomóż.

+0

ciekawe pytanie! +1 – fge

+1

Kompiluje w 'javac'. Czy jesteś pewien, że Java 8 jest włączona dla twojego projektu? – axtavt

+0

Wygląda na to, że kompilujesz wcześniej niż w wersji 8 – Reimeus

Odpowiedz

6

Działa to dobrze w Netbeans Lamba buduje pobrać ze strony: 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()); 
    } 

} 
0

O ile wiem Netbeans 7.4 w pełni obsługuje Java 8. miałem problemy z Eclipse (ATM nie wspierającym java8 tak to tylko w stanie aby skompilować stare wyrażenia Lambda z 7), dlatego przełączyłem się na Netbeans. Jeśli masz zainstalowaną wcześniejszą wersję Netbeans, upewnij się, że w pełni go odinstalowałeś, aby upewnić się, że nowszy nie może odnosić się do starych Logfiles itp.

3

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

Właśnie teraz próbowałem poniższy kod i to działa dobrze 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)); 
Powiązane problemy