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

时间:2015-11-14 06:21:44

标签: java java-8 java-stream

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

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

使用Java 8 Stream是否可行?

6 个答案:

答案 0 :(得分:13)

我的免费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));

这些功能可以很好地适用于任何流源(无论是否随机访问),并完全支持并行流。

答案 1 :(得分:10)

一种方法是生成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;
});

这仅适用于顺序流。

答案 2 :(得分:2)

可以使用

Stream.reduce,具体取决于目标。如你所说,你想比较连续的元素,下面将打印&#34;相同的3&#34;:

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
});

答案 3 :(得分:0)

您始终执行以下操作之一:

  1. 将您的信息流转换为包含信息流最后几个元素“历史记录”的元素流
  2. 处理您的信息流,使当前处理的元素被视为“下一个”元素,之前处理的元素被视为“当前”元素。
  3. 这个解决方案的实现可以在这个帖子中看到:Is it possible to get next element in the Stream?

答案 4 :(得分:0)

我必须这样做并比较流的元素(最初是数组)的差异。 所以我使用了一个方法作为UnaryOperator的参数,.map()期望如下......并且它对我有用,没有任何特殊的小发明:

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。这有点超出我的意义。 希望这会对你有所帮助。

答案 5 :(得分:0)

例如,如果您有一个整数列表,并且想要检查它们是否升序排列,则可以执行以下操作:

@Test
public void test_listIsSorted() {

    // create integer list for testing purposes: 0,1,2,3, .., 10
    List<Integer> integerList = IntStream.range(0, 10)
            .boxed()
            .collect(Collectors.toList());

    // stream list and compare item n with n+1
    integerList.stream()
            .reduce((integer1, integer2) -> {
                assert integer1 < integer2 : "ordering must be ascending";
                // return second value (which will be processed as "integer1" in the next iteration
                return integer2;
            });

}

这将比较像(0,1),(1,2,...,...