2 回答
TA贡献1842条经验 获得超21个赞
您可能希望保留循环,但对其进行现代化改造:
Map<Animal, List<Farm>> map = new EnumMap<>(Animal.class);
for(Farm farm: list)
for(Animal an: farm.getAnimals())
map.computeIfAbsent(an, x -> new ArrayList<>()).add(farm);
在你的循环中,add(farm)冗余出现在两个分支中,因为你总是将它添加到List. 然后,computeIfAbsent允许消除条件,因为它将返回一个现有值或构造一个新值,放入并返回它。收集groupingBy器在内部也使用这种方法。
使用 Stream 操作的缺点是您需要临时持有两个值,例如
Map<Animal, List<Farm>> map = list.stream()
.flatMap(farm -> farm.getAnimals().stream()
.map(animal -> new AbstractMap.SimpleImmutableEntry<>(animal, farm)))
.collect(Collectors.groupingBy(Map.Entry::getKey,
() -> new EnumMap<>(Animal.class),
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
TA贡献1752条经验 获得超4个赞
我从对面开始,但我想这很有帮助
Map<Animal, List<Farm>> map = Arrays.stream(Animal.values()) .collect(Collectors.toMap(an -> an, an -> list.stream().filter(f -> f.getAnimals().contains(an)).collect(Collectors.toList())));
在没有任何农场包含动物的情况下,动物可能有空集,但这可以很容易地过滤
添加回答
举报