учитывая, что у меня есть список элементов, которые все наследуются от одного базового класса:
class Item {
protected String name;
public Item(String name) {
this.name = name;
}
getName() {
return name;
}
}
class ItemA extends Item {...}
class ItemB extends Item {...}
List<Item> itemList = Arrays.asList(new ItemA("itemA"), new ItemB("itemB"));
В моем случае я не контролирую, как эти классы реализованы, но мне нужно разделить список на два разных списка, содержащих имя соответствующего элемента.
Вот первая попытка решения, содержащего множество операторов if
и instanceof
:
List<String> itemAList = new ArrayList<>();
List<String> itemBList = new ArrayList<>();
itemList.forEach(item -> {
if(item instanceof ItemA) {
itemAList.add(item.getName());
}
else if(item instanceof ItemB) {
itemBList.add(item.getName());
}
});
Так что это работает, но я немного подумал, как избежать операторов if
. Поскольку я использую Java 8, я могу сделать это:
List<String> itemAList = itemList.stream()
.filter(ItemA.class::isInstance)
.map(item -> item.getName())
.collect(Collectors.toList());
List<String> itemBList = itemList.stream()
.filter(ItemB.class::isInstance)
.map(item -> item.getName())
.collect(Collectors.toList());
Это также работает, но это означает, что мне нужно обработать список два раза.
Как я уже сказал, я не имею никакого отношения к реализации классов Item
, так как лучше всего реализовать такое поведение?
Привет
[edit:] Спасибо за все ответы. Сегодня я узнал что-то новое.