我有一个 DTO 列表,这些 dto 包含一个标签列表。我正在寻找包含 2 个标签的 dto,每个标签都有自己的键和值。这段代码可以工作 - 但它只会在内部过滤器上找到第一个,我想收集而不是找到第一个,以防有多个具有该条件的对象
List<myDTO> responsesList = getAllData(parameters);
List<myDTO> result = responsesList.stream()
.filter(d ->
d.getData().getTags().stream()
.filter(t -> t.getKey().equals(key1) && t.getValue().equals(value1))
.findFirst().isPresent())
.filter(d ->
d.getData().getTags().stream()
.filter(t -> t.getKey().equals(key2) && t.getValue().equals(value2))
.findFirst().isPresent())
.collect(Collectors.toList());
我在收集集合而不是 findFirst().isPresent()
时缺少什么?如果我这样做 Collect(collectors.toList)
我会收到一条错误消息,例如“推断变量 T 具有不兼容的边界”?
最佳答案
目前还不清楚你想要什么。如果您需要收集所有同时具有 key1/value1 标签和 key2/value2 标签的 myDTO
对象,那么您的代码已经可以工作了。您可以缩短它,因为 filter(predicate).findFirst().isPresent()
可以替换为 anyMatch(predicate)
:
List<myDTO> result = responsesList.stream()
.filter(d ->
d.getData().getTags().stream()
.anyMatch(t -> t.getKey().equals(key1) && t.getValue().equals(value1)))
.filter(d ->
d.getData().getTags().stream()
.anyMatch(t -> t.getKey().equals(key2) && t.getValue().equals(value2)))
.collect(Collectors.toList());
您还可以将两个过滤器
连接到单个谓词中,尽管这是一个品味问题:
List<myDTO> result = responsesList.stream()
.filter(d ->
d.getData().getTags().stream()
.anyMatch(t -> t.getKey().equals(key1) && t.getValue().equals(value1))
&&
d.getData().getTags().stream()
.anyMatch(t -> t.getKey().equals(key2) && t.getValue().equals(value2)))
.collect(Collectors.toList());
如果你确实想收集匹配的标签,你可能需要一个flatMap
:
List<myTag> result = responsesList.stream()
.flatMap(d -> d.getData().getTags().stream())
.filter(t -> t.getKey().equals(key1) && t.getValue().equals(value1) ||
t.getKey().equals(key2) && t.getValue().equals(value2))
.collect(Collectors.toList());
关于java - 使用 Java 8 过滤流后收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36336944/