使用Java 8流处理嵌套集合

Prz*_*iec 8 java optimization dictionary java-8 java-stream

最近我在使用嵌套集合(List中的Maps值)时遇到了一个问题:

List<Map<String, Object>> items
Run Code Online (Sandbox Code Playgroud)

在我的案例中,此列表包含10-20个地图.在某些时候我不得不将Calculationkey的值替换descriptionRating.所以我想出了这个解决方案:

items.forEach(e -> e.replace("description","Calculation","Rating"));
Run Code Online (Sandbox Code Playgroud)

如果此列表中的所有映射都包含键值对,那将是非常精细和有效的解决方案["description", "Calculation"].不幸的是,我知道整体上只有一对List<Map<String, Object>>.

问题是:

是否有更好(更有效)的解决方案来查找和替换这一个值,而不是使用Java-8流迭代所有List元素?

完美将是在一个流中完成它而不对其进行任何复杂/混淆操作.

And*_*lko 5

items.stream()
     .filter(map -> map.containsKey("description"))
     .findFirst()
     .ifPresent(map -> map.replace("description", "Calculation", "Rating"));
Run Code Online (Sandbox Code Playgroud)

您将不得不遍历列表,直到"description"找到带有密钥的地图.拿起第一个,并尝试更换.


正如@Holger所指出的,如果"description"所有地图的密钥都不是单一的,那么该对("description", "Calculation")是唯一的:

items.stream()
     .anyMatch(m -> m.replace("description", "Calculation", "Rating"));
Run Code Online (Sandbox Code Playgroud)

  • OP没有说关键的"描述"是独一无二的.映射"["描述","计算"]`被认为是唯一的. (3认同)
  • @AndrewTobilko好吧,你现在有一个有状态的谓词,这是不鼓励的,这就是我没有建议的原因.但这是一个务实的解决方案. (2认同)