使用索引

时间:2015-12-21 12:40:45

标签: functional-programming java-8 java-stream

我一直在练习java 8流和功能风格。 有时我尝试使用流来解决一些编程难题。 在这段时间里,我发现了一类我不知道如何用流来解决的任务,只有经典的方法。

此类任务的一个例子是: 给定一个数字数组,找到元素的索引,它将使数组左边部分的总和低于零。 例如对于数组[1, 2, 3, -1, 3, -10, 9],答案为5

我的第一个想法是使用IntStream.generate(0, arr.length)...,但后来我不知道如何累积值并同时了解索引。

所以问题是:

  • 是否有可能以某种方式在流上累积值然后进行条件退出?
  • 什么是并行执行?它不适合找到我们需要了解元素顺序的索引的问题。

1 个答案:

答案 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:它将给定函数应用于headtail流的第一个元素,然后预先{{1 }}。现在您可以使用此head

scanLeft

同样可以应用于无限流(例如随机数流):

scanLeft(StreamEx.of(1, 2, 3, -1, 3, -10, 9), Integer::sum).indexOf(x -> x < 0);

这将持续到累积和变为负数并返回相应元素的索引。