查找具有不同对象的集合之间的交集

时间:2015-05-06 07:39:48

标签: java guava lambdaj

我有自定义对象列表,如下所示:

List<CustomObject> existingValues

另一个包含id的集合,它已从客户端发送,并包含Set<Long> ids以上的CustomObject的id。

我的目标是使用CustomObject返回集合,该集合仅包含ids相交的元素。

我可以通过嵌套每个周期来执行此操作。但它看起来有点难看。

在SQL中我可以用查询做类似的事情:

select * where customobject.id in (some ids...)

通过lamdajguava可以获得它?

4 个答案:

答案 0 :(得分:1)

使用Java 8,您可以使用流过滤器实现此目的:

List<CustomObject> collect = existingValues.stream()
.filter(object -> ids.contains(object.getId()))
.collect(Collectors.toList());

为了熟悉java流,我建议使用官方Oracle Tutorial

答案 1 :(得分:1)

使用Guava,完成如下:

    final Set<Long> ids = ...; //initialize correctly

    List<CustomObject> results = FluentIterable.from(existingValues).filter(new Predicate<CustomObject>() {
        @Override
        public boolean apply(final CustomObject input) {
            return ids.contains(input.getId());
        }
    }).toList();

答案 2 :(得分:0)

是的,因为@ wuethrich44在Java 8中说解决方案是:

List<CustomObject> collect = existingValues.stream()
    .filter(object -> ids.contains(object.getId()))
    .collect(Collectors.toList());

如果你的版本比Java 8早:

List<CustomObject> collect = new ArrayList<CustomObject>();
for(CustomObject object: existingValues) {
    if(ids.contains(object.getId())) {
        collect.add(object);
    }
}

对于早于Java 5的版本:

List<CustomObject> collect = new ArrayList<CustomObject>();
Iterator<CustomObject> iterator = existingValues.iterator();
while(iterator.hasNext()) {
    CustomObject object = iterator.next();
    if(ids.contains(object.getId())) {
        collect.add(object);
    }
}

但是带流的版本更好:执行时间更快,更简洁,如果您习惯使用它可读性更高

答案 3 :(得分:0)

如果您可以使用我的xpresso库,您可以将列表推导与lambda表达式一起使用,如下所示:

list<CustomObject> filtered = x.list(x.<CustomObject>yield().forEach(existingValues).when(x.lambdaP("x : f1(f0(x))",x.invoke("getId"),x.in(ids))));