Java 使用谓词筛选列表

Java 使用谓词筛选列表,java,guava,predicate,Java,Guava,Predicate,我有两个对象数组列表,如何使用guava过滤器过滤出每个对象的标题彼此相等?每个对象都有一个getTitle()方法 List<Foo> listA; List<Bar> listB; for (Foo item: listA) { Iterables.filter(listB, new Predicate() { //predicate here } } 列表列表a; 名单b; 对于(Foo项目:列表A) { filter(listB,ne

我有两个对象数组列表,如何使用guava过滤器过滤出每个对象的标题彼此相等?每个对象都有一个
getTitle()
方法

List<Foo> listA;
List<Bar> listB;
for (Foo item: listA)
{
   Iterables.filter(listB, new Predicate()
   {
     //predicate here
   }
}
列表列表a;
名单b;
对于(Foo项目:列表A)
{
filter(listB,new Predicate())
{
//这里的谓词
}
}

使用番石榴可以这样做(不检查空值,也不优化空集合):

//如果任何数组为空或null,您可以立即返回
Set titlesB=newhashset(Collections2.transform(listB,(b)->b.getTitle());
Set titlesA=newhashset(Collections2.transform(listA,(a)->a.getTitle());
//您可以进一步优化检查最小集合(集合上包含的是O(1)操作)
设置titlesIntersection=Collections2.filter(titlesB,(b)->titlesA.contains(b));
List commonA=Collections2.filter(listA,(a)->titlesIntersection.contains(a.getTitle());
List commonB=Collections2.filter(listB,(b)->titlesIntersection.contains(b.getTitle());
还有,apachecommons交集函数


但无论如何,您都需要在这里使用一些额外的步骤。

请查看的“注意事项”部分,看看您的案例是否属于该部分。
// 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()));