我希望以前没有问过这个问题.在java 8中,我myArray在输入中有一个String数组和一个整数maxLength.我想计算我的数组中的字符串数小于maxLength.我想使用流来解决此问题.
为此,我想这样做:
int solution = Arrays.stream(myArray).filter(s -> s.length() <= maxLength).count();
Run Code Online (Sandbox Code Playgroud)
但是我不确定这是否是正确的方法.它需要经过第一个数组,然后通过过滤后的数组进行计数.
但是如果我不使用流,我可以轻松地制作一个算法,我在myArray上循环一次.
我的问题很简单:有没有办法用相同的时间性能来解决这个问题而不是循环?它总是一个使用流的"好"解决方案吗?
但是我不确定这是否是正确的方法.它需要经过第一个数组,然后通过过滤后的数组进行计数.
你假设它将执行多次传递是错误的.有一些叫做操作融合的东西,即可以在数据的单次传递中执行多个操作;
在这种情况下Arrays.stream(myArray)将创建一个流对象(廉价操作和轻量级对象),filter(s -> s.length() <= maxLength).count();将组合成单个传递数据,因为在管道中没有有状态操作,而不是过滤流的所有元素然后计算所有传递谓词的元素.
Brian Goetz的帖子在这里发表声明:
相比之下,流管道将其操作融合到尽可能少的数据传递中,通常是一次传递.(有状态的中间操作,例如排序,可能会引入需要多遍执行的障碍点.)
至于:
我的问题很简单:有没有办法用相同的时间性能来解决这个问题而不是循环?
取决于数据量和每个元素的成本.无论如何,对于少数元素,循环的必要性几乎总是赢得,如果不是总是.
它总是一个使用流的"好"解决方案吗?
不,如果你真的关心性能,那么测量,测量和测量.
使用流来表示它是声明性的,因为它的抽象,构成以及当你知道你将从中受益时可以从并行性中获益.