3 回答
TA贡献1797条经验 获得超4个赞
首先,对所有动物进行计数,然后选择出现多次的动物:
import static java.util.stream.Collectors.*;
.....
Map<Class<? extends Animal>, Long> animalCounts = animals.stream()
.flatMap(
lst -> lst.stream()
.map(a -> a.getClass())
.distinct() // in case several of the same animal are in the same place
)
.collect(groupingBy(x -> x, counting()));
List<Class<? extends Animal>> animalTypes = animalCounts.entrySet().stream()
.filter(e -> e.getValue() > 1)
.map(Map.Entry::getKey)
.collect(toList());
TA贡献1785条经验 获得超4个赞
首先,也许您应该尝试使用flatMap而不是map。
animals.stream()。map(place-> place.stream()。map(animal-> animal.getClass())。collect(Collectors.toSet()));
其次,实际上我们可以使用外部ConcurrentHashMap做到这一点,这将使我们能够parallel在需要时使用。
ConcurrentHashMap<Class, AtomicLong> theCounterMap = new ConcurrentHashMap<>();
animals.stream().flatMap(list -> list.stream().map(animal -> animal.getClass()).distinct())
.forEach(clazz -> theCounterMap.computeIfAbsent(clazz, k -> new AtomicLong()).getAndIncrement());
List<Class> classList = theCounterMap.entrySet().stream()
.filter(entry -> entry.getValue().get() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
但是,如果您需要跟踪源列表(作为两个不同的位置),则需要进一步修改上面的解决方案。
更新
根据@shmosel的建议,您可以直接使用一种更简单的方法来实现相同的目标,如下所示:
Map<Class, Long> theCounterMap = animals.stream().flatMap(list -> list.stream().map(animal -> animal.getClass()).distinct())
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
List<Class> classList = theCounterMap.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
添加回答
举报