我正在努力使用包含一些Stream API方法的评估表达式。 例如:
sample.reads.stream().filter(s -> s.l.length() < 10)
这不起作用:
sample.reads.stream().filter(s -> s.l.length() < 10).collect(Collectors.toList())
给出:
但是,sample.reads.stream().count()
或sample.reads.stream().toArray()
以及任何其他表达式都能正常工作(如果我将流API调用放入代码中也可以正常工作)
配置: Java的: jdk1.8.0_144
思想: IntelliJ IDEA 2017.3.1(社区版) Build#IC-173.3942.27,建于2017年12月11日 JRE:1.8.0_152-release-1024-b8 amd64 JVM:JetBrains s.r.o的OpenJDK 64位服务器VM Windows 10 10.0
更新
抱歉,混淆。甚至终端命令也不起作用。我展示了这个例子,因为我发现examption是在filter方法上抛出的,而不是在collect上。如果我添加.collect(),我会看到相同的错误
更新2 我觉得这不适合上课。即使这样也给了我同样的错误:
IntStream.range(0, 100).filter(i -> i%2 == 0).toArray()
答案 0 :(得分:6)
这是一个猜测,但问题似乎是与类路径相关的问题。因此,您会收到无法找到特定包的消息。
我认为这不是由于终端或非终端流操作造成的。甚至非终端操作也可以在IDEA中进行评估而不会出错。见:
我强烈建议检查IDEA中的运行/调试配置,并检查该应用程序使用的是哪个类路径。打开以下对话框,检查&#34;使用模块的类路径&#34;字段:
错误的价值可能会潜入那里。
答案 1 :(得分:-1)
在这里查看JAVA Stream API文档 -
流操作分为中间和终端 操作,并组合形成流管道。一条小溪 管道由一个源(如Collection,一个数组,一个 生成器功能,或I / O通道);然后是零或更多 中间操作,如Stream.filter或Stream.map;和a 终端操作,如Stream.forEach或Stream.reduce。
中间操作返回一个新流。他们总是懒惰; 执行诸如filter()之类的中间操作实际上并不是这样 执行任何过滤,而是创建一个新的流,当时 遍历,包含匹配的初始流的元素 给出谓词。直到管道源的遍历才开始 执行管道的终端操作。
终端操作,例如Stream.forEach或IntStream.sum,可以 遍历流以产生结果或副作用。之后 执行终端操作,考虑流管道 消耗,不能再使用;如果你需要遍历相同的 再次数据源,您必须返回数据源才能获得新的数据源 流。
正如它所说,过滤器是一个中间操作,而不是终端。要执行或完成流管道,您必须具有终端操作。因此,Intellij正在提供编译错误。
如果是Fade
或Transparent
,sample.reads.stream().count()
&amp; sample.reads.stream().toArray()
- 两者都是终端操作,因此工作正常。
要解决您的问题,请在Intellij表达式求值程序中执行类似的操作 -
count()
这里,toArray()
是终端操作&amp;它会将结果放在sample.reads.stream().filter(s -> s.l.length() < 10).collect(Collectors.toList());
所述的列表中。