首页 > 解决方案 > 如何正确生成一个应该跳过一个数字的长流?

问题描述

该方法应返回从 -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));

}

谢谢您的意见。我想第二种变体是产生这种流的最好方法。

标签: optimizationjava-stream

解决方案


这将是一个品味问题。选择你,尤其是你的读者——那些在你之后维护你的代码的人——会喜欢的版本。这里还有一个选项。我喜欢让您的要求在代码中更明确地跳过一个数字。

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,但这取决于您使用流的目的。如果担心,您将需要自己进行测量。


推荐阅读