我有以下代码:
public List<MainObject> filterListByNestedObjectAttribute(List<MainObject> mainObjects) {
List<MainObject> mainObjectFiltered = mainObjects.stream()
.filter(mainObject -> {
NestedObject nestedObject = Collections.max(mainObject.getNestedObjects(), Comparator.comparing(nestedObject -> nestedObject.getDate()));
return businessValidation(nestedObject) || businessValidation2(nestedObject);
})
.collect(Collectors.toList());
}
重点是,过滤器永远不会被调用...... 无论我做什么,过滤器都会被忽略,流的结果是相同列表!!
我做错了什么吗? 对另一个 Java lambda 的调用会破坏过滤器调用吗?
<小时/>编辑
我在 void main 中应用了相同的代码并工作了......
在单元测试中,IDE 正在缓存过滤器的值,我不知道为什么......
代码:
public class LambdaJumpsFilter {
public static void main(String[] args) {
LambdaJumpsFilter lambdaJumpsFilter = new LambdaJumpsFilter();
NestedObject nestedA1 = lambdaJumpsFilter.new NestedObject("A", OffsetDateTime.now().plusDays(3));
NestedObject nestedB1 = lambdaJumpsFilter.new NestedObject("B", OffsetDateTime.now().plusDays(2));
NestedObject nestedC1 = lambdaJumpsFilter.new NestedObject("C", OffsetDateTime.now().plusDays(1));
NestedObject nestedA2 = lambdaJumpsFilter.new NestedObject("A", OffsetDateTime.now().plusDays(1));
NestedObject nestedB2 = lambdaJumpsFilter.new NestedObject("B", OffsetDateTime.now().plusDays(2));
NestedObject nestedC2 = lambdaJumpsFilter.new NestedObject("C", OffsetDateTime.now().plusDays(3));
MainObject mainObject1 = lambdaJumpsFilter.new MainObject();
MainObject mainObject2 = lambdaJumpsFilter.new MainObject();
List<NestedObject> nestedObjects1 = new ArrayList<>();
nestedObjects1.add(nestedA1);
nestedObjects1.add(nestedB1);
nestedObjects1.add(nestedC1);
List<NestedObject> nestedObjects2 = new ArrayList<>();
nestedObjects2.add(nestedA2);
nestedObjects2.add(nestedB2);
nestedObjects2.add(nestedC2);
mainObject1.setNestedObjects(nestedObjects1);
mainObject2.setNestedObjects(nestedObjects2);
List<MainObject> mainObjects = new ArrayList<>();
mainObjects.add(mainObject1);
mainObjects.add(mainObject2);
List<MainObject> mainObjectFiltered = mainObjects.stream()
.filter(mainObject -> {
NestedObject nestedObjectMax = Collections.max(mainObject.getNestedObjects(), Comparator.comparing(nestedObject -> nestedObject.getDateTime()));
return lambdaJumpsFilter.businessValidation(nestedObjectMax) || lambdaJumpsFilter.businessValidation2(nestedObjectMax);
})
.collect(Collectors.toList());
System.out.println(mainObjectFiltered.size());
}
private boolean businessValidation2(NestedObject nestedObject) {
return nestedObject.equals("D");
}
public boolean businessValidation(NestedObject nestedObject){
return nestedObject.value.equals("A");
}
public class MainObject{
private List<NestedObject> nestedObjects;
public List<NestedObject> getNestedObjects() {
return nestedObjects;
}
public void setNestedObjects(List<NestedObject> nestedObjects) {
this.nestedObjects = nestedObjects;
}
}
public class NestedObject {
private String value;
private OffsetDateTime dateTime;
public NestedObject(String value, OffsetDateTime dateTime) {
this.value = value;
this.dateTime = dateTime;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public OffsetDateTime getDateTime() {
return dateTime;
}
public void setDateTime(OffsetDateTime dateTime) {
this.dateTime = dateTime;
}
}
}
<小时/>
我知道那是绝望,但我花了几个小时寻找类似的东西。
我发现为什么 DEBYG 没有在过滤器中传递...
当我进行单元测试时,我花费了相同的值,并且(我不知道为什么)IDE 已经知道过滤器的值并最终忽略过滤器。
最佳答案
说实话,我不相信过滤器被跳过。对我来说,您的过滤器逻辑是错误的,并且为所有元素返回 true
(假设这不是您所期望的),或者您只认为应该跳过某些元素,而事实并非如此。
试试这个
List<MainObject> mainObjectFiltered = mainObjects.stream()
.filter(mainObject -> {
NestedObject nestedObject = Collections.max(mainObject.getNestedObjects(), Comparator.comparing(nestedObject -> nestedObject.getDate()));
boolean result=businessValidation(nestedObject) || businessValidation2(nestedObject);
System.out.println("Im am indeed filtering: "+result);
return result;
})
.collect(Collectors.toList());
并告诉我控制台上没有输出:)
可以跳过过滤器的唯一情况是流为空,但据我从您的描述中可以看出,情况并非如此
关于java - 为什么java lambda会跳转过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49831178/