0

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

List<CustomObject> existingValues

还有另一个带有 id 的集合,该集合已从客户端发送并包含上面提到的 CustomObject 的 id Set<Long> ids

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

我可以简单地使用嵌套的每个周期来做到这一点。但它看起来有点难看。

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

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

以哪种方式可以用lamdajor来实现guava

4

4 回答 4

1

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

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

为了熟悉 java 流,我推荐官方Oracle 教程

于 2015-05-06T07:58:47.950 回答
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();
于 2015-05-11T15:36:28.750 回答
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);
    }
}

但是带有流的版本更好:在执行时间方面更快,更少冗长,并且如果您习惯了它,则更具可读性

于 2015-05-06T09:09:11.713 回答
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))));
于 2015-06-11T02:40:02.163 回答