我正在编写一段代码,其中有一个String []和一个采用此String []并返回Byte []的方法,该方法将string-Byte对保持在几个Byte可以为空的位置。最终,我必须转换Byte并从String []获取一个以键为字符串的映射,并以value作为转换的返回。这就是我在Java 8流中实现相同方法的方式:
IntStream.range(0, productReferences.length)
.filter(index -> (null!= productsPrice[index])).boxed()
.collect(Collectors.toMap(position -> productReferences[position],
position ->callSomeMethod(productsPrice[position])));
其中productReference是String [],而productPrice []是Byte []数组。
现在的问题是IntStream.boxed()方法。在内部,它将int装箱到Integer,以便它返回一个Stream,我认为这是一个比较昂贵的操作。
其他方法将使用Java进行循环
for(int i=0;i<productReferences.length; i++){
if (productsPrice[index]==null) continue;
//other code
}
处理这种情况的最佳方法是什么?我知道创建IntStream的原因,但是如果我可以在不带boxed()方法的collect方法中真正拥有索引,从而避免装箱呢?
您可以使用collect
已有的操作,IntStream
而不必将其装箱到中Stream<Integer>
。
IntStream.range(0, productReferences.length)
.filter(index -> productsPrice[index] != null)
.collect(
HashMap::new,
(m, i) -> m.put(productReferences[i], callSomeMethod(productsPrice[i])),
Map::putAll
);
Integer
因为收集器的消费者部分需要一个索引,所以不会将每个索引都装在索引中ObjIntConsumer
; 所以i
在上面的代码中是一个int
。正如Holger指出的那样,Collectors.toMap
如果该版本将覆盖值,则在键重复的情况下,使用的原始代码将引发异常。
您仍然需要在真实数据上对这两个解决方案进行基准测试,以查看是否带来了改善。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句