【问题标题】:Filtering based on previous element in java 8 stream基于java 8流中的前一个元素进行过滤
【发布时间】:2019-12-26 00:26:46
【问题描述】:

我有一个特定的条件,我是否想通过与前一个元素进行比较来将列表分成两部分。情况是有一个名为 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 流来做到这一点?

【问题讨论】:

  • 给我们一个例子和预期的结果。它将帮助我们为您提供解决方案。我不确定您是否想在看到一个具有前一个元素且开始时间为 0 的元素时立即停止
  • 显而易见的方法只是掩饰 for 循环而没有真正添加任何东西。如果您想并行执行,我认为您最好直接使用带有 for 循环的 fork-join 框架。
  • 哦,Guava 显然有 zip,您认为它对将列表压缩到被元素截断的自身很有用。
  • 从订单列表中,我只想提取其前一个元素的 startTime 字段设置为 0 的单独列表。

标签: java java-8 java-stream


【解决方案1】:

“从对象列表中,我只想提取其前一个元素的字段设置为 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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多