假设我有一个List<List<Animal>> animals。此嵌套列表表示一个位置列表,其中每个位置都包含动物列表。
我需要找出至少出现在两个不同位置的动物类型列表。我知道我可以进行常规循环并执行该操作。有什么方法可以通过Stream API完成吗?
例子:
List<List<Animal>> animals = new ArrayList<>();
animals.add(Arrays.asList(new Dog(), new Cat()));
animals.add(Arrays.asList(new Dog(), new Bird()));
animals.add(Arrays.asList(new Bird()));
预期(等同于):
List<Class<? extends Animal>> animalTypes = Arrays.asList(Dog.class, Bird.class);
至于尝试,我只设法将内部列表转换为一组类:
animals.stream().map(place -> place.stream().map(animal -> animal.getClass()).collect(Collectors.toSet()));
更新
在没有Stream API的情况下执行此操作的代码:
final List<List<Animal>> animals = new ArrayList<>();
animals.add(Arrays.asList(new Dog(), new Cat()));
animals.add(Arrays.asList(new Dog(), new Bird()));
animals.add(Arrays.asList(new Bird()));
final Map<Class<? extends Animal>, Integer> count = new HashMap<>();
for (final List<Animal> place : animals) {
final Set<Class<? extends Animal>> uniqueTypes = new HashSet<>();
for (final Animal animal : place) {
uniqueTypes.add(animal.getClass());
}
for (final Class<? extends Animal> type : uniqueTypes) {
if (!count.containsKey(type))
{
count.put(type, 1);
}
else
{
count.put(type, count.get(type).intValue() + 1);
}
}
}
final List<Class<? extends Animal>> typesAppearingAtLeastAtTwoPlaces = new ArrayList<>();
for (final Class<? extends Animal> type : count.keySet()) {
if (count.get(type).intValue() >= 2) {
typesAppearingAtLeastAtTwoPlaces.add(type);
}
}
System.out.println(typesAppearingAtLeastAtTwoPlaces);
输出:
[class Test$Dog, class Test$Bird]
繁星coding
万千封印
九州编程
相关分类