gpt4 book ai didi

java - 是否可以使用 Streams.intRange 函数?

转载 作者:行者123 更新时间:2023-11-29 07:38:42 24 4
gpt4 key购买 nike

我想使用 Streams.intRange(int start, int end, int step) 来实现逆序流。但是,java.util.Streams 类似乎不再可用(但它仍在标准库的 rt.jar 中)。这个方法是在其他类中还是被其他类替换了?

最佳答案

目前提出的两种解决方案都不考虑并行化。 @fge 提出的拆分器根本没有并行化。 @RealSkeptic 提出的基于迭代的流将使用缓冲并行化(一些数字将加载到中间数组中并移交给另一个线程),这并不总是有效。

有一个非常简单的替代解决方案可以提供正常的并行化(这里 end 是唯一的):

public static IntStream intRange(int start, int end, int step ) {
int limit = (end-start+step-(step>>31|1))/step;
return IntStream.range(0, limit).map(x -> x * step + start);
}

或者,如果您想考虑非常奇怪的输入,例如 intRange(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE):

public static IntStream intRange(int startInclusive, int endExclusive, int step) {
if(step == 0)
throw new IllegalArgumentException("step = 0");
if(step == 1)
return IntStream.range(startInclusive, endExclusive);
if(step == -1) {
// Handled specially as number of elements can exceed Integer.MAX_VALUE
int sum = endExclusive+startInclusive;
return IntStream.range(endExclusive, startInclusive).map(x -> sum - x);
}
if((endExclusive > startInclusive ^ step > 0) || endExclusive == startInclusive)
return IntStream.empty();
int limit = (endExclusive-startInclusive)*Integer.signum(step)-1;
limit = Integer.divideUnsigned(limit, Math.abs(step));
return IntStream.rangeClosed(0, limit).map(x -> x * step + startInclusive);
}

关于java - 是否可以使用 Streams.intRange 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32586604/

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