如何正确地生成一个应该跳过一个数字的长流?



该方法应该返回从-n到n的长流,除了0。对于n = 3,流应该是-3,-2,-1,1,2,3。

哪种方法更好?

(1)

public static LongStream getLongStream(int n) {
return n == 0 
? LongStream.empty() 
: LongStream.concat(
LongStream.range(-n, 0), 
LongStream.rangeClosed(1, n));
}

(2)

public static LongStream getLongStream(int n) {
return LongStream.concat(
LongStream.range(-n, 0), 
LongStream.rangeClosed(1, n));
}

谢谢你的评论。我认为第二种变体是生成这种流的最好方法。

这是个人喜好的问题。选择您,特别是您的读者(在您之后维护您代码的人)更喜欢的版本。这里还有一个选择。我喜欢让你的需求一个数字应该被跳过在代码中更明确。

public static LongStream getLongStream(int n) {
return LongStream.rangeClosed(-n, n).filter(i -> i != 0);
}

试一试:

System.out.println(getLongStream(3).boxed().collect(Collectors.toList()));

输出:

[-3, -2, -1, 1,2,3]

运行时效率低于你的版本。Holger的评论似乎表明,对于较大的n值,差异可能很大,尽管这取决于您使用流的目的。如果需要,您需要自己进行测量。

我认为在优化方面,第二种变体是最好的。

public static LongStream getLongStream(long n) {
return LongStream.concat(
LongStream.range(-n, 0), 
LongStream.rangeClosed(1, n));
}

相关内容

  • 没有找到相关文章

最新更新