[英]How to implement this with the Java SE 8 Stream API?
我试过下面的代码转换成java8:
List<Value> values = valueRepository.findByCorp(corpId, type, "NONE");
Map<Integer, List<String>> map = new HashMap<>();
List<Value> tempList = new ArrayList<>();
//This is working code snippet
values.forEach(v -> {
for (Product product : products) {
if (!isEditable(map.get(product.getProductId()), v.getId().getCode()) ||
"TEST".equals(v.getId().getCode())) {
continue;
}
temList.add(v);
break;
}
});
private boolean isEditable(List<String> list, String type) {
return list != null && list.size() > 0 && list.contains(type);
}
这是我到目前为止尝试过的东西:
values.forEach(v -> {
Optional<ProductDTO> findProduct = products.stream().filter(isEditable(map.get(product.getProductId()), v.getId().getCode()) ||
!"TEST".equals(v.getId().getCode())).findFirst();
if(findProduct.isPresent()) {
temList.add(v);
}
});
但它以某种方式不起作用。 非常感谢任何帮助。
使用了错误的逻辑运算符,更改||
到&&
:
values.forEach(v -> {
Optional<ProductDTO> findProduct = products.stream().filter(isEditable(map.get(product.getProductId()), v.getId().getCode()) &&
!"TEST".equals(v.getId().getCode())).findFirst();
if(findProduct.isPresent()) {
temList.add(v);
}
});
不使用isEditable function
List<Value> tempList = values.stream()
.filter(v -> v.getId().getCode() != "TEST")
.filter(v -> products.stream()
.map(p -> map.get(p.getProductId()))
.filter(Objects::nonNull)
.filter(l -> l.size() > 0)
.filter(l -> l.contains(v.getId().getCode()))
.findFirst().isPresent())
.collect(Collectors.toList());
Stream 值的内容,并通过使用您的(否定)条件将每个value
与所有产品进行比较来过滤它们。 您的条件是跳过/继续-否定时相同会导致条件在最终结果中包含一个值。
tempList = values.stream()
.filter(value -> !"TEST".equals(value.getId().getCode())
.filter(value -> products.stream()
.anyMatch(product -> isEditable(map.get(product.getProductId()),
value.getId().getCode()))
.collect(Collectors.toList());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.