gpt4 book ai didi

java - 开销 : Convert Between Primitive Streams vs. 拳击

转载 作者:行者123 更新时间:2023-11-30 06:05:45 27 4
gpt4 key购买 nike

我正在使用 Java 8 Stream API,如下所示:

private Function<Long, Float> process;          // Intermediate step (& types)

private long getWeekFrequency(final ScheduleWeek week) {
return week.doStreamStuff().count(); // Stream<>.count() returns long
}

@Override
public float analyse(final Schedule sample) {
return (float) sample // cast back to float
.getWeeks()
.stream()
.mapToLong(this::getWeekFrequency) // object to long
.mapToDouble(process::apply) // widen float to double
.sum();
}

@Override
public String explain(final Schedule sample) {
return sample
.getWeeks()
.stream()
.map(this::getWeekFrequency) // change stream type?
.map(String::valueOf)
.collect(Collectors.joining(", "));
}

问题

  • 我假设在对象/原始 Stream 类型之间进行更改时会产生开销...如果我坚持使用 Stream<>,这与装箱开销相比如何?

  • 如果我稍后改回来怎么办?

具体:
在分析师中,我应该使用 .map(...).mapToDouble(...)
在解释中,我应该使用 .mapToLong(...).mapToObj(...)

最佳答案

那么让我们来分解一下:

.mapToLong(this::getWeekFrequency)

给你一个原始的长整型。

.mapToDouble(process::apply)

这个原始 long 被装箱为 Long,因为 process 函数需要它。 process 返回一个 Float,它映射到一个原始 double 值(通过 Float.doubleValue())。

将它们相加,并将总和转换为原始 float (缩小,但你说安全),然后返回。


那么我们如何摆脱一些自动装箱呢?我们想要一个FunctionalInterface这与我们的 process 函数完全匹配,无需使用任何盒子类。我们没有可以使用现成的工具,但我们可以轻松地定义它,如下所示:

@FunctionalInterface
public interface LongToFloatFunction
{
float apply(long l);
}

然后我们将声明更改为:

private LongToFloatFunction process;

并保持其他所有内容相同,这将防止任何自动装箱。函数返回的原始浮点型将自动加宽为原始 double 型。

关于java - 开销 : Convert Between Primitive Streams vs. 拳击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879942/

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