如何根据某些条件中途停止减少操作?

时间:2015-06-09 14:31:22

标签: java-8 java-stream

如何根据某些条件在中途停止减少操作?

例如,如何在命中0之前在整数列表中找到最大值的索引。因此在下面的代码中,处理list1应该返回4(第5个元素),而处理list2应该返回1(第2个元素,因为8它是5,8,3中的最大值,它们是0之前的值。

    List<Integer> list1 = Arrays.asList(5, 8, 3, 2, 10, 7);
    List<Integer> list2 = Arrays.asList(5, 8, 3, 0, 2, 10, 7);
    // This will work for list1 but not for list2
    IntStream.range(0, list1.size())
            .reduce((a, b) -> list1.get(a) < list1.get(b) ? b : a)
            .ifPresent(ix -> System.out.println("Index: " + ix));

1 个答案:

答案 0 :(得分:2)

减少意味着处理整个值集,而不指定实际处理将以何种顺序发生。在这方面,没有“在x点停止”可能,因为这意味着处理顺序。

所以简单的答案是,reduce不支持它,因此,如果你想限制搜索范围,首先进行限制:

List<Integer> list2 = Arrays.asList(5, 8, 3, 0, 2, 10, 7);
int limit=list2.indexOf(0);
IntStream.range(0, limit>=0? limit: list2.size())
        .reduce((a, b) -> list2.get(a) < list2.get(b) ? b : a)
        .ifPresent(ix -> System.out.println("Index: " + ix));

请注意,您可以使用this answer中所述的低级Stream接口实现一种以某种条件结束的新Spliterator,但我认为这种努力不会还清。