2 回答

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
您可能希望保留循環(huán),但對其進(jìn)行現(xiàn)代化改造:
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);
在你的循環(huán)中,add(farm)冗余出現(xiàn)在兩個(gè)分支中,因?yàn)槟憧偸菍⑺砑拥絃ist. 然后,computeIfAbsent允許消除條件,因?yàn)樗鼘⒎祷匾粋€(gè)現(xiàn)有值或構(gòu)造一個(gè)新值,放入并返回它。收集groupingBy器在內(nèi)部也使用這種方法。
使用 Stream 操作的缺點(diǎn)是您需要臨時(shí)持有兩個(gè)值,例如
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貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
我從對面開始,但我想這很有幫助
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())));
在沒有任何農(nóng)場包含動(dòng)物的情況下,動(dòng)物可能有空集,但這可以很容易地過濾
添加回答
舉報(bào)