如何使用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函数

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());

流式传输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());

最新更新