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

bhu*_*pen 20 java java-8 java-stream

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

如果我迭代a List,我想比较当前与列表的下一个元素.

是否可以使用Java 8 Stream?

Tag*_*eev 14

我的免费StreamEx库允许您使用额外的pairMap中间操作来处理流元素对.像这样:

StreamEx.of(input).pairMap((current, next) -> doSomethingWith(current, next));
Run Code Online (Sandbox Code Playgroud)

其中inputCollection,阵列或Stream.例如,通过这种方式,您可以轻松检查输入是否已排序:

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

还有forPairs终端操作,它forEach类似于所有输入元素对:

StreamEx.of(input).forPairs((current, next) -> doSomethingWith(current, next));
Run Code Online (Sandbox Code Playgroud)

这些功能可以很好地与任何流源(随机访问或不随机访问)一起使用,并完全支持并行流.


Era*_*ran 10

一种方法是生成IntStream索引,并List通过索引获取元素.这只有在List支持随机访问时才有效(即如果你List是a LinkedList,那将是一个坏主意,因为list.get(i)不需要持续时间).

例如 :

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

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

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

这仅适用于顺序流.


Mar*_*bel 6

可以使用Stream.reduce,具体取决于目标。正如您所说,您想比较连续的元素,以下将打印“相同 3”:

Stream.of(1,2,3,3).reduce((a,b)->{
    if(a==b) System.out.println("Same "+a);
    return b; // will be "a" for next reduction
});
Run Code Online (Sandbox Code Playgroud)