gpt4 book ai didi

java - IntStream.boxed() 与 for 循环 |表现

转载 作者:行者123 更新时间:2023-11-30 06:52:15 25 4
gpt4 key购买 nike

我正在编写一段代码,其中我有一个 String[] 和一个采用此 String[] 并返回 Byte[] 的方法,该方法维护字符串-字节对,其中很少有 Byte 可以为 null。最终,我必须转换 Byte 并从 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[],productPrice[] 是 Byte[] 数组。

现在的问题是 IntStream.boxed() 方法。在内部,它将 int 装箱到 Integer 以便它返回一个 Stream,我认为这是一个成本更高的操作。

其他方法是使用 java for 循环

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

您仍然需要根据您的真实数据对这两种解决方案进行基准测试,看看这是否会带来改进。

关于java - IntStream.boxed() 与 for 循环 |表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39268658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com