Java 8 如何根据某些情况中途停止reduce操作?

Java 8 如何根据某些情况中途停止reduce操作?,java-8,java-stream,Java 8,Java Stream,如何根据某些情况中途停止reduce操作 例如,在命中0之前,如何在整数列表中找到最大值的索引。因此,在下面的代码中,处理list1应该返回4(第5个元素),而处理list2应该返回1(第2个元素,因为8是在0之前的值5、8、3中的最大值) list1=Arrays.asList(5,8,3,2,10,7); list2=Arrays.asList(5,8,3,0,2,10,7); //这将适用于列表1,但不适用于列表2 IntStream.range(0,list1.size()) .redu

如何根据某些情况中途停止reduce操作

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

list1=Arrays.asList(5,8,3,2,10,7);
list2=Arrays.asList(5,8,3,0,2,10,7);
//这将适用于列表1,但不适用于列表2
IntStream.range(0,list1.size())
.reduce((a,b)->list1.get(a)System.out.println(“索引:+ix));

缩减是指在不指定实际处理顺序的情况下对整个值集进行处理。在这方面,不可能“在x点停止”,因为这意味着处理顺序

因此,简单的答案是,
reduce
不支持它,因此,如果要限制搜索范围,请首先执行限制:

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)System.out.println(“索引:+ix));
请注意,您可以实现一种新的
,它使用中所述的低级
拆分器
接口在特定条件下结束,但我认为这种努力不会有回报

从Java 9开始,您可以使用:

IntStream.range(0,list2.size())
.takeWhile(ix->list2.get(ix)!=0)
.reduce((a,b)->list2.get(a)System.out.println(“索引:+ix));
takeWhile
取决于前面流的遭遇顺序。由于
IntStream.range
生成一个有序流,因此可以保证只有在遭遇顺序中第一个不匹配元素之前的元素才会被后续缩减使用。

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