我正在写一段代码,其中我有一个String []和一个方法,它接受这个String []并返回Byte [],保持string-Byte对,其中几个字节的位置可以为null。最后,我必须转换字节并从String []获取带键的字符串作为字符串,并将值作为转换的返回值。这就是我在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 [],productsPrice []是Byte []数组。
现在的问题是IntStream.boxed()方法。在内部,它将int设置为Integer,以便返回Stream,我相信这是一个更昂贵的操作。
其他方式是使用java for loop
for(int i=0;i<productReferences.length; i++){
if (productsPrice[index]==null) continue;
//other code
}
处理此类情况的最佳方法是什么?我理解创建IntStream的原因但是如果我能在没有boxed()方法的情况下在collect方法中实际拥有索引从而避免装箱?
答案 0 :(得分:4)
您可以使用IntStream
上的collect
操作,而不是将其装入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
);
由于收集器的消费者部分需要ObjIntConsumer
,因此不会将每个索引编入Integer
。因此,上面代码中的i
是int
。 As Holger noted,使用Collectors.toMap
的初始代码会在重复键的情况下抛出异常,此版本将覆盖该值。
您仍需要对实际数据中的两个解决方案进行基准测试,看看是否会带来改进。