我一直在练习java 8流和功能风格。 有时我尝试使用流来解决一些编程难题。 在这段时间里,我发现了一类我不知道如何用流来解决的任务,只有经典的方法。
此类任务的一个例子是:
给定一个数字数组,找到元素的索引,它将使数组左边部分的总和低于零。
例如对于数组[1, 2, 3, -1, 3, -10, 9]
,答案为5
我的第一个想法是使用IntStream.generate(0, arr.length)...
,但后来我不知道如何累积值并同时了解索引。
所以问题是:
答案 0 :(得分:2)
在我的StreamEx库中使用新的headTail
方法,可能会创建一个适用于非常长或无限流的惰性解决方案。首先,我们可以定义一个新的中间scanLeft
操作:
public static <T> StreamEx<T> scanLeft(StreamEx<T> input, BinaryOperator<T> operator) {
return input.headTail((head, tail) ->
scanLeft(tail.mapFirst(cur -> operator.apply(head, cur)), operator)
.prepend(head));
}
这使用scanLeft
定义了一个惰性headTail
:它将给定函数应用于head
和tail
流的第一个元素,然后预先{{1 }}。现在您可以使用此head
:
scanLeft
同样可以应用于无限流(例如随机数流):
scanLeft(StreamEx.of(1, 2, 3, -1, 3, -10, 9), Integer::sum).indexOf(x -> x < 0);
这将持续到累积和变为负数并返回相应元素的索引。