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())));
在沒有任何農場包含動物的情況下,動物可能有空集,但這可以很容易地過濾
添加回答
舉報