java - 获取用户输入值并使用 java 中的 Streams 处理它们
问题描述
下面的代码在给定的用户输入中找到数字 5 的位置。有没有一种方法可以通过延迟评估使用 java 8 Streams 编写以下代码,而无需将数据存储在内存中。
public class HelloWorld{
public static void main(String []args){
Scanner s=new Scanner(System.in);
int count=0;
while(s.hasNextInt()){
count++;
if(s.nextInt()==5){
break;
}
}
System.out.println(count);
}
}
解决方案
TL;DR:不要使用迭代方法优越的流。
虽然可以做到,但这种转换要么效率低下,要么相当棘手,而且无论如何都会破坏流的目的。您的代码中有两个点,这使得这里的迭代方法比流式传输更可取:
你改变一个状态变量
count
,而流函数最好是无状态的您使用
break
它是为了过早地完成迭代,而流通常在处理完所有元素之前不会完成。
过早地脱离流是可能的,但这很棘手。也可以通过将输入的每个标记与其序列号配对来避免改变外部变量,但生成的代码将更慢且更难阅读。
代码可能如下所示的示例:
System.out.println(new BufferedReader(new InputStreamReader(System.in)).lines()
.mapToInt(Integer::valueOf)
.takeWhile(number -> number != 5)
.count() + 1);
推荐阅读
- firebase - firebase 实时数据库分片规则
- vue.js - 如何在 datepicker vuetify 中添加加载?
- python - 如何使用 Python pandas-datareader 0.8 从 Alpha Vantage 正确调用数据
- python - 如何在 swig 中使用 numpy.i?
- chisel - 如何制作数据结构
- node.js - 在哪里可以找到 Google API 客户端的 credentials.json?
- python - 如何从 URL 中提取文件名以及附加的一些额外数据?
- c# - 如何使用使用哈希加密、C#、ASP.NET MVC、实体框架的存储过程验证帐户
- rsa - 如何使用我在 PuTTY 中生成的 SSH-1 RSA 公钥/私钥对
- android - 如何在 android webview 中添加打印支持