java - 根据使用 Java 8 流的元素之间的差异拆分数字的有序列表多个列表

标签 java list java-8

第一次在这里提问所以请放轻松。 :) 无论如何,我不确定使用 Java 8 流是否可行,但我对学习非常感兴趣。

假设我有以下有序的数字列表:

List<Integer> myList = Arrays.asList(1, 2, 3, 7, 9, 12, 13, 15);

现在,当元素之间的差异大于 2 时,我想将此列表拆分为多个列表。因此,最终结果将是三个不同的列表:

{1, 2, 3}
{7, 9}
{12, 13, 15}

我可以使用 for 循环轻松完成此练习,并在循环时将当前元素与前一个元素进行比较。但是,我想知道是否有一种简洁的方法可以使用 Java 8 流来完成此操作?就像我之前说的,这只是为了我自己对 Java 8 的学习和理解,所以如果不可能,那也没关系。

提前感谢您的任何评论或回答。

最佳答案

好吧,我只能想到自定义收集器,因为您需要一些先前的状态,但这还不够简洁(除非您将其隐藏在方法后面):

 private static <T> Collector<Integer, ?, List<List<Integer>>> diffCollector() {

    class Acc {

        private Integer previous;

        private List<List<Integer>> result = new ArrayList<>();

        void accumulate(Integer elem) {
            if (previous == null) {
                previous = elem;
                List<Integer> list = new ArrayList<>();
                list.add(previous);
                result.add(list);
                return;
            }

            if (elem - previous > 2) {
                List<Integer> oneMore = new ArrayList<>();
                oneMore.add(elem);
                result.add(oneMore);
                previous = elem;
            } else {
                result.get(result.size() - 1).add(elem);
                previous = elem;
            }
        }

        Acc combine(Acc other) {

            throw new UnsupportedOperationException("Not for parallel");
        }

        List<List<Integer>> finisher() {
            return result;
        }

    }
    return Collector.of(Acc::new, Acc::accumulate, Acc::combine, Acc::finisher);
}

用法是:

 List<Integer> myList = Arrays.asList(1, 2, 3, 7, 9, 12, 13, 15);
 System.out.println(myList.stream().collect(diffCollector()));

关于java - 根据使用 Java 8 流的元素之间的差异拆分数字的有序列表多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45941328/

相关文章:

java - Java中如何测试子类的相等性?

java - Hibernate 模式异常一对多

java - GridLayout 的程序逻辑错误

C++ 错误 : expected identifier before ‘int’

python - 当存在重复项时,如何将两个元素列表转换为字典(一个元素将是键,另一个将是值)?

java - 带 TextView 的行生成器

python - 如何将值从一个列表移动到另一个列表,同时从第一个列表中删除它们

java - 将 Map<Key, List<Value>> 转换为 Map<Key, Value>

java - 单个执行者的单独执行队列以跟踪剩余的

java - 如何将 lambda 表达式重构为方法引用?