2013-06-28 20 views
11

Ich versuche, größere Hash-Karte auf einmal zu deklarieren und zu definieren. Dies ist, wie ich es tun:Java 8: HashMap-Initialisierung mit Lambda-Ausdrücken

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

Aber, wenn ich versuche, Lambda-Ausdrücke in Körper von put zu verwenden, ich bin warrning/Fehler auf Eclipse zu treffen. Dies ist, wie ich Lambda in HashMap verwenden:

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

Eklipse ganzen Teil von Lambda unterstreicht vor mit Komma beginnen. Fehlermeldungen:

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

Weiß jemand, was mache ich falsch? Ist die Initialisierung durch Lambda-Ausdruck in HashMap zulässig? Bitte helfen Sie.

+0

Interessante Frage! +1 – fge

+1

Kompiliert in 'javac'. Sind Sie sicher, dass Java 8 für Ihr Projekt aktiviert ist? – axtavt

+0

Sieht so aus, als ob Sie kompilieren mit einem Compiler früher als Version 8 – Reimeus

Antwort

6

Dies funktioniert in der Netbeans Lamba fein heruntergeladen Builds: 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

Soweit ich weiß, Netbeans 7.4 unterstützt Java 8. Ich hatte Probleme mit Eclipse (atm es nicht java8 unterstützt, so dass es nur in der Lage ist um die alten Lambda-Ausdrücke von 7) zu kompilieren, deshalb bin ich zu Netbeans gewechselt. Wenn Sie eine frühere Version von Netbeans installiert haben, stellen Sie bitte sicher, dass sie vollständig deinstalliert ist, um sicherzustellen, dass das neuere nicht auf alte Logfiles usw. verweist.

3

Sie tun, aktualisieren Sie JDK-Bibliothek auf Version 1.8 von Java-Erstellungspfad in Eclipse-Projekteigenschaften.

Ich habe gerade versucht nun den Code unten und es funktioniert auf meinem 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));