【问题标题】:Create Map from two lists with some filtering通过一些过滤从两个列表创建地图
【发布时间】:2022-10-18 19:18:32
【问题描述】:

我有两个列表如下

List<String> keys = List.of("A1", "B1", "A2", "B2");
List<List<String>> values = List.of(List.of("A1", "B1"), List.of("A2", "B2"), List.of("A1", "B2"), List.of("A2", "B1"));

我想从这两个列表中制作一张地图在申报时.

Map<String, List<List<String>>> result = Map.ofEntries(
    Map.entry("A1", List.of(List.of("A1", "B1"), List.of("A1", "B2"))),
    Map.entry("A2", List.of(List.of("A2", "B2"), List.of("A2", "B1"))),
    Map.entry("B1", List.of(List.of("A1", "B1"), List.of("A2", "B1"))),
    Map.entry("B2", List.of(List.of("A2", "B2"), List.of("A1", "B2")))
)

如您所见,每个map entry 的值都聚集了包含键值的values entry

我尝试使用stream api、map methodfilter method 制作这个 Map 对象。

Map<Object, Object> result1 = keys.stream()
    .map(key -> List.of(key, values.stream().filter(value -> value.contains(key)).toList()))
    .collect(Collectors.toMap(data -> data.get(0), data -> data.get(1)));   

这有效,但看起来很难看。

我认为应该有比这更有效的方法。

告诉我改善这一点的最佳方法。

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    首先流式传输密钥,并使用toMap 收集器。您可以根据keys 列表中的元素指定映射的键和值。

    映射的键只是键列表的元素,未更改,映射的值是 values 的(内部)列表,其中包含 keys 列表中的元素。您可以在此处流式传输values 列表和filter

    var result = keys.stream().collect(Collectors.toMap(
        key -> key, // or Function.identity()
        key -> values.stream().filter(value -> value.contains(key)).toList()
    ));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2022-11-25
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      相关资源
      最近更新 更多