2015-08-04 4 views
4

Я хочу сделать это в Java 8Фильтрующие элементы из списка на основе другого списка

У меня есть список Boolean и другой Object список, размер этих двух списков всегда одинаковы. Я хочу удалить все элементы из списка object, которые имеют false по соответствующему индексу в списке boolean.

Я попытаюсь объяснить на примере:

objectList = {obj1,obj2,obj3,obj4,obj5}; 
booleanList = {TRUE,FALSE,TRUE,TRUE,FALSE}; 

Так что с этим списком, я хочу изменить objectList к

{obj1,obj3,obj4}// obj2 and obj5 are removed because corresponding indices are `FALSE` in `booleanList`. 

Если я есть сделать это в Java 7, я хотел бы сделать следующие:

List<Object> newlist = new ArrayList<>(); 
for(int i=0;i<booleanList.size();i++){ 
    if(booleanList.get(i)){ 
     newList.add(objectList.get(i)); 
    } 
} 
return newList; 

Есть ли способ сделать это в Java 8 с меньшим кодом?

+3

Предполагая, что списки произвольного доступа, 'Список resultList = IntStream.range (0, booleanList.size()). Filter (booleanList :: get) .mapToObj (objectList :: get) .collect (toList()); ', вероятно, наиболее эффективен, который вы можете получить. –

+0

@AlexisC. это сработало, спасибо :) – Karthik

ответ

4

Вы можете использовать IntStream для создания индексов, а затем filter получить отфильтрованные индексы и mapToObj получить соответствующие объекты:

List<Object> newlist = 
    IntStream.range(0,objectList.size()) 
      .filter(i -> booleanList.get(i)) 
      .mapToObj(i -> objectList.get(i)) 
      .collect(Collectors.toList()); 
+0

Это было быстро, спасибо :) – Karthik

+2

@karthik, обратите внимание, что на самом деле это не «меньший код», как вы хотели. Ваше решение Java-7 составляет 178 байт (включая пробелы), в то время как это решение составляет 206 байт ;-) –

+0

@TagirValeev Я не говорил в терминах 'bytes': P, я беспокоился о получении ответов, например:« Вы можете написать то же самое код в Java 8 тоже'. Вот почему добавлен «меньший код». – Karthik

Смежные вопросы