我有Foo类的列表:
public class Foo {
private Key key;
private String value;
}
public class Foo.Key {
private String category;
private String pref;
private String platform;
}
需要将其转换为Map
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()))));
答案 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
是这里的线索。