2014-11-12 5 views
0

У меня есть список объектов из массива, как я могу использовать фильтр гуавы, чтобы отфильтровать только название каждого объекта, равного друг другу? Каждый объект имеет метод getTitle().Использование предиката для фильтрации списка

List<Foo> listA; 
List<Bar> listB; 
for (Foo item: listA) 
{ 
    Iterables.filter(listB, new Predicate() 
    { 
    //predicate here 
    } 
} 
+1

http://stackoverflow.com/questions/8636502/filtering-a-list-of-javabeans-with-google-guava – blank

+1

Обратите внимание на раздел оговорки [этой ссылки] (https: // code. google.com/p/guava-libraries/wiki/FunctionalExplained) и посмотреть, может ли ваш случай подпадать под это. – Henrik

ответ

0

Использование гуавы может быть сделано, как это (без проверки нулевой и оптимизации на пустой коллекции):

// If any of the arrays empty or null, you can return straight away 
Set<String> titlesB = new HashSet<String>(Collections2.transform(listB, (b) -> b.getTitle())); 
Set<String> titlesA = new HashSet<String>(Collections2.transform(listA, (a) -> a.getTitle())); 

// You can further optimize checking the smallest collection (contains is O(1) operation on Set) 
Set<String> titlesIntersection = Collections2.filter(titlesB, (b) -> titlesA.contains(b)); 

List<Foo> commonA = Collections2.filter(listA, (a) -> titlesIntersection.contains(a.getTitle())); 
List<Foo> commonB = Collections2.filter(listB, (b) -> titlesIntersection.contains(b.getTitle())); 

Существует также, Apache Commons перекрестков

https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/CollectionUtils.html

Но в любом случае вам нужно будет использовать какой-то дополнительный шаг.

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