IntStream.boxed()vs for循环|性能

时间:2016-09-01 10:08:49

标签: java java-8 java-stream

我正在写一段代码,其中我有一个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方法中实际拥有索引从而避免装箱?

1 个答案:

答案 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。因此,上面代码中的iintAs Holger noted,使用Collectors.toMap的初始代码会在重复键的情况下抛出异常,此版本将覆盖该值。

您仍需要对实际数据中的两个解决方案进行基准测试,看看是否会带来改进。