2015-10-28 70 views
1

地圖鍵我有一個嵌套的地圖Map<String, Map<String, Map<String, ...>迭代使用Java 8拉姆達

我將如何使用Java 8 lambda表達式到地圖導航了。這裏可能勢在必行的解決方案:當你需要提供有一個方法,像Runnable任何接口的實例

Object getObjectWithKey(String key) { // key = "parent.parent1.parent1.1" 
    Map head = mainMap; 

    for (String k in key.split(".")){ 
     head = head.get(k); 
    } 

    return (Object) head; 
} 
+1

你爲什麼想使用lambdas? Lambdas是匿名類的語法糖,但在你的情況下,它們不適用。 –

+0

@ÁlvaroGutiérrez只是爲了鍛鍊目的 – Macchiatow

+1

我完全不理解這一點。這張地圖有多少層次的嵌套? –

回答

5

正如評論中所指出的,我完全不明白這一點。應將json文檔轉換爲適當類型的Java對象,而不是一些高度嵌套的Map<String, Map<String, Map<String, ...>>>

即使沒有lambda表達式,這將需要從ObjectMap<String, Object>未經檢查的轉換,並且在運行時它可能很容易因爲ClassCastException而失敗。

在此之上添加lambdas會增加額外的複雜度,因爲lambda體中使用的變量必須有效最終,而head會在每個階段重新分配。您可以通過使用長數組解決這個問題1.

生成的代碼是可怕的(我做提倡這種做法),但它達到你要求什麼:

Object[] head = {mainMap}; 
Stream.of(key.split(".")).forEach(s -> { 
    head[0] = ((Map<String, ?>) head[0]).get(s); 
}); 
return head[0]; 
1

Lambda表達式是合適的。

例如:

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     System.out.println("Running on thread: " + Thread.currentThread()); 
    } 
}).start(); 

可以轉換爲:

new Thread(() -> { 
    System.out.println("Running on thread: " + Thread.currentThread()); 
}).start(); 

甚至:

new Thread(() -> System.out.println("Running on thread: " + Thread.currentThread())).start(); 

在你的情況,我不明白,你需要這樣的實例。