optimization - 如何正确生成一个应该跳过一个数字的长流?
问题描述
该方法应返回从 -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
,但这取决于您使用流的目的。如果担心,您将需要自己进行测量。
推荐阅读
- java - 我无法在 JENA 中获得 Restriction 的特征
- python - 竞争性编程:我的代码有什么问题?我的代码运行成功,但代码不会提交
- php - 嵌套数组,用数字替换字母键并保持结构
- firebase - Google Cloud Platform 中的 Firebase 实时数据库
- python - % 增加数字记录中的值
- javascript - React - 在 renderProps 函数上使用回调抛出错误
- mysql - MySQL中主表的某些列如何与子表同步?
- arrays - iOS 如何转换字典
查询包含数组的参数 - postgresql - 如何从其他 hstore 更新现有的 hstore 值(如果缺少则添加)?
- php - Symfony 路径未打开链接但在新选项卡中工作