Какой лучший способ отфильтровать список? - PullRequest
0 голосов
/ 23 ноября 2011

Допустим, у меня есть такая простая структура класса:

Vehicle
|-- Bus
`-- Car

Bus and Car extends Vehicle

У меня есть List<Vehicle>. Как я могу получить только автобусы или машины? Я хотел бы избежать instanceof оператора. Нужно ли использовать шаблон посетителя или есть более простое решение?

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011

Ну что-то нужно будет использовать instanceof или эквивалент (например, Class.isInstance).

Гуава имеет метод, который делает именно это, хотя: Iterables.filter. Чтобы вы могли использовать:

List<Bus> buses = Lists.newArrayList(Iterables.filter(vehicles, Bus.class));
3 голосов
/ 23 ноября 2011

Я не вижу способа избежать использования оператора instanceof в вашем случае, и при этом я не могу найти способ создать намного более простой код, чем этот (без помощи Guava):

List<Bus> buses = new ArrayList<Bus>();
for (Vehicle v : vehicles)
    if (v instanceof Bus)
        buses.add(v);
0 голосов
/ 23 ноября 2011

Если вы не хотите, чтобы instanceOf добавил поле в Vehicle, определяющее класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...