java – 在无限流上调用.map()?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在无限流上调用.map()?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1983字,纯文字阅读大概需要3分钟。
内容图文
![java – 在无限流上调用.map()?](/upload/InfoBanner/zyjiaocheng/820/0d551f9962964d81b0ca69780cc077e5.jpg)
根据Javadocs for SE 8,Stream.map()执行以下操作
Returns a stream consisting of the results of applying the given function to the elements of this stream.
但是,我正在阅读的一本书(用Java学习网络编程,Richard M. Reese)在一个echo服务器中大致实现了以下代码片段.
Supplier<String> inputLine = () -> {
try {
return br.readLine();
} catch(IOException e) {
e.printStackTrace();
return null;
}
};
Stream.generate(inputLine).map((msg) -> {
System.out.println("Recieved: " + (msg == null ? "end of stream" : msg));
out.println("echo: " + msg);
return msg;
}).allMatch((msg) -> msg != null);
这应该是完成获取用户输入以打印到套接字输入流的功能方法.它按预期工作,但我不太清楚如何.是因为map知道流是无限的,所以当新的流令牌变得可用时它会懒惰地执行吗?似乎在向地图迭代的集合中添加一些东西是一个小黑魔法.有人可以帮我理解幕后发生的事情吗?
以下是我重申这一点的方法,以避免令人困惑的地图使用.我相信作者试图避免无限循环,因为你无法摆脱forEach.
Stream.generate(inputLine).allMatch((msg) -> {
boolean alive = msg != null;
System.out.println("Recieved: " + (alive ? msg : "end of stream"));
out.println("echo: " + msg);
return alive;
});
解决方法:
流是懒惰的.把它们想象成链条中的工人,将桶子互相传递.懒惰的事实是,如果他们面前的工人要求他们,他们只会向他们后面的工人询问下一个桶.
所以最好将其视为allMatch – 这是一个最终动作,因此渴望 – 向地图流询问下一个项目,地图流询问下一个项目的生成流,以及生成流流向其供应商,以及一旦到达就提供该项目.
当allMatch停止询问物品时停止.当它知道答案时就会这样做.此流中的所有项目都不为空吗?一旦allMatch收到一个null的项目,它就知道答案是假的,并且将完成并且不再要求任何项目.因为流是无限的,所以它不会停止.
所以你有两个因素导致它按照它的工作方式工作 – 一个是allMatch急切地询问下一个项目(只要前面的那个不是null),并且生成流 – 为了提供下一个项目 – 可能需要等待等待用户发送更多输入的供应商.
但是应该说这里不应该使用地图.地图中不应有副作用 – 它应该用于将一种类型的项目映射到另一种类型的项目.我认为这个例子仅用作学习辅助工具.更简单直接的方法是使用BufferedReader‘s method lines(),它为您提供来自缓冲读卡器的有限串流.
内容总结
以上是互联网集市为您收集整理的java – 在无限流上调用.map()?全部内容,希望文章能够帮你解决java – 在无限流上调用.map()?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。