Java8 - 在流上过滤后计数

Tho*_*ier 2 java java-stream

我希望以前没有问过这个问题.在java 8中,我myArray在输入中有一个String数组和一个整数maxLength.我想计算我的数组中的字符串数小于maxLength.我想使用流来解决此问题.

为此,我想这样做:

int solution = Arrays.stream(myArray).filter(s -> s.length() <= maxLength).count();
Run Code Online (Sandbox Code Playgroud)

但是我不确定这是否是正确的方法.它需要经过第一个数组,然后通过过滤后的数组进行计数.

但是如果我不使用流,我可以轻松地制作一个算法,我在myArray上循环一次.

我的问题很简单:有没有办法用相同的时间性能来解决这个问题而不是循环?它总是一个使用流的"好"解决方案吗?

Ous*_* D. 6

但是我不确定这是否是正确的方法.它需要经过第一个数组,然后通过过滤后的数组进行计数.

你假设它将执行多次传递是错误的.有一些叫做操作融合的东西,即可以在数据的单次传递中执行多个操作;

在这种情况下Arrays.stream(myArray)将创建一个流对象(廉价操作和轻量级对象),filter(s -> s.length() <= maxLength).count();将组合成单个传递数据,因为在管道中没有有状态操作,而不是过滤流的所有元素然后计算所有传递谓词的元素.

Brian Goetz的帖子在这里发表声明:

相比之下,流管道将其操作融合到尽可能少的数据传递中,通常是一次传递.(有状态的中间操作,例如排序,可能会引入需要多遍执行的障碍点.)

至于:

我的问题很简单:有没有办法用相同的时间性能来解决这个问题而不是循环?

取决于数据量和每个元素的成本.无论如何,对于少数元素,循环的必要性几乎总是赢得,如果不是总是.

它总是一个使用流的"好"解决方案吗?

不,如果你真的关心性能,那么测量,测量测量.

使用流来表示它是声明性的,因为它的抽象,构成以及当你知道你将从中受益时可以从并行性中获益.

  • 来吧,选民,我不能成为认为这是一个很棒的答案的人. (2认同)