查找具有不同对象的集合之间的交集
Find intersection between collections with different objects
我有如下自定义对象列表:
List<CustomObject> existingValues
还有另一个集合,其中包含从客户端发送的 ID,其中包含上面提到的 CustomObject 的 ID Set<Long> ids
。
我的目标是 return 与 CustomObject 的集合将只包含 id 相交的元素。
我可以简单地为每个循环嵌套来做到这一点。不过有点难看。
在 SQL 我可以用查询做类似的事情:
select * where customobject.id in (some ids...)
用什么方法可以用lamdaj
或guava
来实现?
使用 Java 8,您可以使用流过滤器实现此目的:
List<CustomObject> collect = existingValues.stream()
.filter(object -> ids.contains(object.getId()))
.collect(Collectors.toList());
为了熟悉 java 流,我推荐官方 Oracle Tutorial。
是的,正如@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);
}
}
但是带有流的版本更好:执行时间更快,更简洁,如果您习惯的话,可读性更好
对于 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();
如果您可以使用我的 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))));
我有如下自定义对象列表:
List<CustomObject> existingValues
还有另一个集合,其中包含从客户端发送的 ID,其中包含上面提到的 CustomObject 的 ID Set<Long> ids
。
我的目标是 return 与 CustomObject 的集合将只包含 id 相交的元素。
我可以简单地为每个循环嵌套来做到这一点。不过有点难看。
在 SQL 我可以用查询做类似的事情:
select * where customobject.id in (some ids...)
用什么方法可以用lamdaj
或guava
来实现?
使用 Java 8,您可以使用流过滤器实现此目的:
List<CustomObject> collect = existingValues.stream()
.filter(object -> ids.contains(object.getId()))
.collect(Collectors.toList());
为了熟悉 java 流,我推荐官方 Oracle Tutorial。
是的,正如@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);
}
}
但是带有流的版本更好:执行时间更快,更简洁,如果您习惯的话,可读性更好
对于 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();
如果您可以使用我的 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))));