web-dev-qa-db-ja.com

ストリームでMultiValueMap <String、String>をMap <String、List <Long >>に変換する方法は?

以下のコードスニペットはmultiValueマップを受け入れ、マップに変換します。今度は、マップを使用して、ストリームを使用して値リストを持つマップを返します。

  public static Map<String, String> decodeMap(MultiValueMap<String, String> multi) {
    if (CollectionUtils.isEmpty(multi)) {
      return Map.of();
    }
    Map<String, String> map = new HashMap<>(multi.entrySet().size());
    for (Map.Entry<String, List<String>> entry : multi.entrySet()) {
      StringBuilder sb = new StringBuilder();
      for (String s : entry.getValue()) {
        if (sb.length() > 0) {
          sb.append(',');
        }
        sb.append(s);
      }
      map.put(entry.getKey(), sb.toString());
    }
    return map;
  }

これは私が試したものですが、うまくいきません:

  Map<String, List<Long>> map = multi.entrySet().stream()
      .filter(f -> multi.containsKey("employee"))
      .collect(Collectors.toMap(Entry ::getKey,Collectors.mapping(e -> Long.parseLong(e.getValue()), Collectors.toList())));

前もって感謝します!

3
Aishwarya Patil

変換する MultiValueMap<String, String>からMap<String, List<Long>>、すべてのMultiValueMap値が数値文字列であると仮定します。

Map<String, List<Long>> map =
    multi.entrySet().stream()
   .filter(f -> multi.containsKey("employee"))
   .collect(Collectors.toMap(Map.Entry::getKey,
        e -> e.getValue().stream().map(Long::parseLong).collect(Collectors.toList())));
2
Eklavya
 Map<String, List<Long>> map = multi.entrySet().stream()
      .filter(f -> multi.containsKey("employee"))
      .flatMap(e->e.getValue().stream()
      .map(v->new AbstractMap.SimpleImmutableEntry<>(e.getKey(), v)))
      .collect(Collectors.toMap(Map.Entry ::getKey,Collectors.mapping(e -> e.getValue(), Collectors.toList())));
1
Ygl