java - 为什么java lambda会跳转过滤器

标签 java lambda

我有以下代码:

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/

相关文章:

android - 覆盖 Kotlin lambda 表达式中的多个接口(interface)方法

java - lambda 性能的差异?

c++ - 如何组合 lambda、可变参数函数和函数指针?

java - 将 XML 文件从 URL 解析为数组

Java、SWT : how to make a shell transparent (not alpha!)

java - 如何让应用程序等待然后开始 Activity 或返回?

java - 正则表达式不起作用,应该如何制定?

java - 在以下使用 PoolingHttpClientConnectionManager 的 Apache HttpClient 中,如何完成资源清理?

Linq - 'Saving' OrderBy 操作 (c#)

c# - 将简单的 lambda 表达式或局部函数分配给委托(delegate)的性能