2016-05-06 33 views
0

我有一種情況,當從主題檢索到消息時,它的格式爲 - List<Map<String, Object>>Java 8 - 流是否有任何功能來修改映射中的值

我必須將這個列表對象傳遞給另一個處理器,但在此之前,我需要修改地圖中的某個值。地圖的關鍵是「時間戳」,EST中的值以毫秒爲單位。我需要將此值轉換爲UTC。

最後,創建整個列表的副本並將其發送到另一個處理器。

我知道我使用Guava Collections創建了一個新副本 - ImmutableList.copyOf(list)

創建副本後,Java 8流中是否有任何內容,所以我不必手動遍歷列表並修改值?

謝謝!

+0

我不明白這個問題。 Java 8仍然是Java。你到底想做什麼? – Tunaki

+1

你確定'Map​​'很適合這個問題嗎?如果「Map」中的所有鍵都是已知的,那麼很可能它應該是一個類。 – biziclop

+3

平原for循環有什麼問題? (for Map <> m:list){Object ts = m.get(「timestamp」); m.put(「timestamp」,changeTs(ts)); }'。使用流來改變數據通常不會很好。 – assylias

回答

0

由於您在發送之前正在製作一個副本,我假定您不想修改原始列表或其內容,否則將列表複製到ImmutableList發送之前。如果是這種情況,您可以在構建您的ImmutableList時創建新地圖。

你需要的第一件事情是一個收集器需要您Stream結果包含修改後的地圖,並把它們放入ImmutableList

static <T> Collector<T, ?, ImmutableList<T>> toImmutableList() { 
    return Collector.of(
      ImmutableList::builder, 
      (ImmutableList.Builder<T> b, T t) -> b.add(t), 
      (b1, b2) -> b1.addAll(b2.build()), 
      ImmutableList.Builder::build); 
} 

然後,您可以流你原來的列表,創建修改地圖爲你的副本去:

List<Map<String,Object>> modifiedList = listOfMaps.stream() 
    .map(map -> { 
      Map<String,Object> newMap = new HashMap<>(map); 
       // set the new timestamp in newMap 
      return newMap; 
    }) 
    .collect(toImmutableList()); 

這會給你一個新的列表與修改的內容,而在您的文章完成你影射了防守副本。

相關問題