2013-06-28 19 views
11

Sto tentando di dichiarare e definire una mappa hash più grande in una volta. Questo è come lo faccio:Java 8: inizializzazione HashMap con espressioni lambda

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

Ma, quando cerco di usare le espressioni lambda nel corpo di put, sto colpendo su Eclipse warrning/errore. Questo è il modo che uso lambda in HashMap:

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

Eclipse sottolinea tutta la parte di lambda a partire da virgola prima. Messaggi di errore:

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

Qualcuno sa che cosa sto facendo di sbagliato? L'inizializzazione tramite espressione lambda è consentita in HashMap? Per favore aiuto.

+0

Domanda interessante! +1 – fge

+1

Compila in 'javac'. Sei sicuro che Java 8 sia abilitato per il tuo progetto? – axtavt

+0

Sembra che tu stia compilando con un compilatore prima della versione 8 – Reimeus

risposta

6

Questo funziona bene in Netbeans Lamba build scaricato da: 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

Per quanto ne so Netbeans 7.4 supporta pienamente Java 8. Ho avuto problemi con Eclipse (ATM non è di supporto java8 quindi è solo in grado per compilare le vecchie espressioni Lambda di 7), ecco perché sono passato a Netbeans. Se hai installato una versione precedente di Netbeans, assicurati di disinstallarla COMPLETAMENTE per assicurarti che la più recente non sia in grado di fare riferimento a vecchi file di registro ecc.

3

Stai facendo la corretta, aggiorna la libreria JDK alla versione 1.8 da Percorso di costruzione Java nelle proprietà del progetto Eclipse.

ho appena provato il codice qui sotto e si sta lavorando bene sul mio 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));