如何根据某些条件在中途停止减少操作?
例如,如何在命中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));
答案 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
,但我认为这种努力不会还清。