[英]Collecting after filtering a stream with Java 8
我有一个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());
您也可以将两个filters
合并为单个谓词,尽管这是一个问题:
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.