2016-05-06 56 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()); 

这会给你一个新的列表与修改的内容,而在您的文章完成你影射了防守副本。

相关问题