首页 > 解决方案 > 基于java 8流中的前一个元素进行过滤

问题描述

我有一个特定的条件,我是否想通过与前一个元素进行比较来将列表分成两部分。情况是有一个名为 field1 的字段,我需要将所有元素分组到另一个列表中,其中先前的元素 field1 为 0。我在 collect 或 groupingBy/partitioningBy 中看不到任何选项来提供与先前元素进行比较的方法。

 private List<Class2> mapClasses(List<Class1> l1) {
        l1.sort(comparingInt(Class1::getField1());
        List<Class1> list1= new ArrayList<>();
        List<Class1> list2 = new ArrayList<>();

        for (int i = 0; i < l1.size(); i++) {
            if (i == 0 && isOk(l1.get(0))) {
                consecutiveClasses.add(l1.get(0));
            } else if (i > 0 && isOk(l1.get(i - 1))) {
                consecutiveClasses.add(l1.get(i));
            } else {
                nonConsecutiveClasses.add(l1.get(i));
            }
        }

        List<Class2> collapsedClass2s = mapNonConsecutiveClasses(nonConsecutiveClass2s);
        mapConsecutiveClasses(consecutiveClasses).ifPresent(collapsedClasses::add);
        return collapsedClasses;
    }

    private boolean m2(Class1 current, Class1 previous) {
        return (current.isLocked() && previous.isLocked()) || (!current.isLocked() && !previous.isLocked());
    }

有没有办法用 Java 8 流做到这一点?

标签: javajava-8java-stream

解决方案


“从对象列表中,我只想提取其前一个元素的字段设置为 0 的单独列表。” 基于此

List<Object2> collect = IntStream.rangeClosed(1, objects.size()-1)
                .filter(i -> objects.get(i - 1).firld1== 0)
                .mapToObj(i -> objects.get(i))
                .collect(Collectors.toList());

推荐阅读