2013-06-28 91 views
11

我試圖一次聲明並定義較大的哈希映射。這就是我要做的事:Java 8:使用lambda表達式進行HashMap初始化

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

但是,當我嘗試在put人體利用lambda表達式,我打的日食warrning /錯誤。這就是我如何在HashMap中使用lambda:

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

Eclipse強調了以逗號開頭的lambda的整個部分。 錯誤消息:

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

有人知道我在做什麼錯嗎?是否允許在HashMap初始化lambda表達式?請幫忙。

+0

有趣的問題! +1 – fge

+1

在'javac'中編譯。你確定你的項目啓用了Java 8嗎? – axtavt

+0

看起來像編譯前版本8編譯器 – Reimeus

回答

6

這正常在NetBeans蘭巴建立從下載: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

據我知道的Netbeans 7.4完全支持Java 8.我與日食的問題(ATM它不支持java8所以它只是能夠編譯7)的舊Lambda表達式,這就是爲什麼我切換到Netbeans。如果你已經安裝了早期版本的Netbeans,請確保完全卸載它以確保新版本無法引用舊的日誌文件等。

3

你正在做的更正,將JDK庫更新爲1.8版本Eclipse項目屬性中的Java Build Path。

我剛纔試了下面的代碼,它工作正常在我的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));