java流将POJO的列表转换为Map <String,List <POJO >>的Map

时间:2020-07-04 00:38:06

标签: java java-stream

我有Foo类的列表:

public class Foo {
  private Key key;
  private String value;
}
public class Foo.Key {
  private String category;
  private String pref;
  private String platform;
}

需要将其转换为Map ,其中第一个String为Foo.Key.category,第二个String为Foo,Key.pref和Lookup类:

public class Lookup {
  private String platform;
  private String value;
}

当前我有以下代码:

Map<String,Map<String, List<Lookup>> map = Maps.newHashMap();
fooList.forEach(
        f -> {
          String category = f.getKey().getCategory();
          String pref = f.getKey().getPref();
          String platform = f.getKey().getPlatform();
          String value = f.getValue();

          Lookup data =
              Lookup.builder()
                  .platform(platform)
                  .value(value)
                  .build();

          if (map.get(category) == null) {
            map.put(category, new HashMap<>());
          }
          map.get(category).computeIfAbsent(pref, (x -> new ArrayList<>())).add(data);
        });

我尝试使用Java流,但无法编译:

fooList.stream()
.collect(Collectors.groupingBy(f -> f.getKey().getCategory(), 
            Collectors.groupingBy(f -> f.getKey().getPref(), 
                Collectors.toList(f -> Lookup.Builder.platform(platform).value(value).build()))));  

               

1 个答案:

答案 0 :(得分:1)

如果您坚持使用流:

Map<String, Map<String, List<Lookup>>> converted = foos.stream()
    .collect(Collectors.groupingBy(foo -> foo.getKey().getCategory(),
        Collectors.groupingBy(foo -> foo.getKey().getPref(),
            Collectors.mapping(foo -> Lookup.builder().platform(foo.getKey().getPlatform()).value(foo.getValue()).build(),
                Collectors.toList()
            )
        )
    ));

如您所见,Collectors.mapping是这里的线索。

相关问题