Java 8 Stream:如何将当前元素与下一个元素进行比较?

2022-09-01 10:49:53

如何从使用Java 8 Streams中获取下一个元素?List

如果我正在迭代一个 ,我想将当前元素与列表的下一个元素进行比较。List

使用Java 8 Stream是否可行?


答案 1

我的免费 StreamEx 库允许您使用其他 pairMap 中间操作来处理流元素对。喜欢这个:

StreamEx.of(input).pairMap((current, next) -> doSomethingWith(current, next));

其中 是 、 数组 或 。例如,通过这种方式,您可以轻松检查输入是否排序:inputCollectionStream

boolean isSorted = StreamEx.of(input)
                           .pairMap((current, next) -> next.compareTo(current))
                           .allMatch(cmp -> cmp >= 0);

还有用于Pairs终端操作,它是所有输入元素对的模拟:forEach

StreamEx.of(input).forPairs((current, next) -> doSomethingWith(current, next));

这些功能可与任何流源(随机访问与否)很好地配合使用,并完全支持并行流。


答案 2

一种方法是生成一个索引,并按索引获取元素。这只有在支持随机访问时才有效(即,如果你是 一个 ,那将是一个坏主意,因为它不需要恒定的时间)。IntStreamListListListLinkedListlist.get(i)

例如:

IntStream.range(0,list.size()-1).forEach(i -> {
    doSomething(list.get(i),list.get(i+1));
});

另一种方法是将最后一个元素存储在数组中:

List<Element> list = ...
Element[] arr = new Element[1];
list.stream().forEach(e -> {
    if (arr[0] != null)
        doSomething(arr[0],e); 
    arr[0]=e;
});

这仅适用于顺序流。


推荐