英文:
How to implement this with the Java SE 8 Stream API?
问题
我已经尝试了以下代码,将其转换为Java 8:
List<Value> values = valueRepository.findByCorp(corpId, type, "NONE");
Map<Integer, List<String>> map = new HashMap<>();
List<Value> tempList = new ArrayList<>();
// 这是有效的代码片段
values.forEach(v -> {
for (Product product : products) {
if (!isEditable(map.get(product.getProductId()), v.getId().getCode()) ||
"TEST".equals(v.getId().getCode())) {
continue;
}
tempList.add(v);
break;
}
});
这是我迄今为止尝试的内容:
values.forEach(v -> {
Optional<ProductDTO> findProduct = products.stream().filter(product ->
isEditable(map.get(product.getProductId()), v.getId().getCode()) ||
!"TEST".equals(v.getId().getCode())
).findFirst();
if (findProduct.isPresent()) {
tempList.add(v);
}
});
但是不知何故它无法正常工作。非常感谢您提供任何帮助。
英文:
I have tried below code to convert into 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);
}
Here is mine stuff what I have tried so far:
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);
}
});
But its not working somehow. Any help is highly appreciable.
答案1
得分: 1
错误的逻辑运算符被使用,将 ||
更改为 &&
:
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);
}
});
英文:
wrong logical operator used, change ||
to &&
:
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);
}
});
答案2
得分: 0
不使用 isEditable 函数
List<Value> tempList = values.stream()
.filter(v -> !v.getId().getCode().equals("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());
英文:
without using 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());
答案3
得分: -1
使用流式处理将 `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());
英文:
Stream the contents of value
and filter them by comparing each value against all products using your (negated) condition. Your condition was to skip/continue - the same when negated would result in a condition to include a value in the final result.
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());
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论