2015-11-14 36 views
9

如何使用Java 8 Streams从列表中获取下一个元素?如果我正在迭代List,我想比较当前列表中的下一个元素,它是否可以使用Java 8 Stream?Java 8 Stream,如何比较当前元素与下一个元素?

+2

迭代如何?你如何确定当前和下一个元素?为什么你觉得需要用流来做到这一点? –

+0

你的目标是? – zeroflagL

+0

我的目标是比较列表中的两个连续元素,或者我想检查它们是否相等。 – bhupen

回答

7

一种方法是生成索引的IntStream,并按索引获取List元素。如果List支持随机访问(即如果您的ListLinkedList,这将是一个坏主意,因为list.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; 
}); 

这将只用于顺序流工作。

11

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

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

inputCollection,阵列或Stream。例如,这样你可以很容易地检查是否输入进行排序:

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

也有forPairs终端操作这是一个forEach模拟所有对输入元素:

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

这些功能有很好的合作任何流源(随机访问或不),并完全支持并行流。

+0

太棒了。感谢您的解释。 – bhupen

0

你总是做下列之一:

  1. 将您的流包含流
  2. 过程的最后几个元素的“历史”元素的流你在当前处理的元素这样的方式流被认为是“下一个”元素,并且之前处理的元素被认为是“当前”元素。这两种解决方案的

实现可以看出,在这个线程:Is it possible to get next element in the Stream?

0

我不得不这样做,比较流(原来的数组)的元素的差异。 所以我用的方法作为参数传递给该.MAP(该UniaryOperator)预计如下...和它的工作对我来说没有任何特殊的小物件的:

import java.util.Arrays; 

class streamDiffUtil { 
    public static void main(String[] args) { 
     int[] elements = {1,2,5}; 
     int result = Arrays.stream(elements) 
       .map(value -> calcMaxDiff(value, elements)) 
       .max() 
       .getAsInt(); 
     System.out.println(result); 
    } 

    private static int calcMaxDiff(int j, int[] elements) { 
     return Arrays.stream(elements) 
       .map(value -> Math.abs(j-value)) 
       .max().getAsInt(); 
    } 
} 

什么将是很好的是要懂得方法calcMaxDiff等同于.map签名中的UnaryIntOperator。这超出了我。 希望这可以帮助你。根据目标,可以使用