2015-10-21 4 views
1

можно ли уменьшить список на основе записей из другого списка?Уменьшить список со значениями из другого списка

Вот что-то подобное:

list1.forEach(l1 -> { 
    list2.forEach(l2 -> { 
     if (l1.getId() == l2.getId()) 
      reducedActions.add(l2); // that's the new list where the filtered entries should be add 
    }); 
}); 

Edit: Что я excpect:

l1: 10, 15, ,16 
l2: 1, 2, 12, 10, 11, 14, 16 
reducedActions: 10, 16 
+1

Что вы имеете в виду уменьшить? Сокращение (агрегация) и фильтрация (выбор) - это две разные вещи. – kai

+2

Можете ли вы просто объяснить, какой результат вы ожидаете? – Holger

+0

, пожалуйста, см. Мое редактирование –

ответ

6

Что об этом?

Set<Integer> ids = list2.stream().map(e -> e.getId()).collect(Collectors.toSet()); 
List<ElementType> reducedActions = list1.stream().filter(e -> ids.contains(e.getId())).collect(Collectors.toList()); 
+3

Не забудьте присвоить результат второй операции переменной ... – Holger

+0

@ Хольджер да :) Я просто не знаю, какие типы объектов содержат list1 и list2, и не хотят используйте список . – hr6134

+4

Скажите «Список ' или аналогичный. Читатель должен уметь адаптироваться ... – Holger

0

С List.retainAll это так просто, как:

List<Integer> list = new ArrayList<Integer>(list2); 
list.retainAll(list1); 

Использование:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class ReduceList { 
    public static void main(String[] args) { 
     List<Integer> list1 = Arrays.asList(10, 15, 16); 
     List<Integer> list2 = Arrays.asList(1, 2, 12, 10, 11, 14, 16); 
     List<Integer> list = new ArrayList<Integer>(list2); 

     list.retainAll(list1); 

     System.out.println(list); 
    } 
} 
Смежные вопросы