Intellij IDEA - 使用流API评估表达式导致错误

时间:2018-01-12 19:42:09

标签: java debugging intellij-idea

我正在努力使用包含一些Stream API方法的评估表达式。 例如:

sample.reads.stream().filter(s -> s.l.length() < 10)

这不起作用:

sample.reads.stream().filter(s -> s.l.length() < 10).collect(Collectors.toList())

给出:

enter image description here

但是,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()

2 个答案:

答案 0 :(得分:6)

这是一个猜测,但问题似乎是与类路径相关的问题。因此,您会收到无法找到特定包的消息。

我认为这不是由于终端或非终端流操作造成的。甚至非终端操作也可以在IDEA中进行评估而不会出错。见:

enter image description here

我强烈建议检查IDEA中的运行/调试配置,并检查该应用程序使用的是哪个类路径。打开以下对话框,检查&#34;使用模块的类路径&#34;字段:

enter image description here

错误的价值可能会潜入那里。

答案 1 :(得分:-1)

在这里查看JAVA Stream API文档 -

  

流操作分为中间和终端   操作,并组合形成流管道。一条小溪   管道由一个源(如Collection,一个数组,一个   生成器功能,或I / O通道);然后是零或更多   中间操作,如Stream.filter或Stream.map;和a   终端操作,如Stream.forEach或Stream.reduce。

     

中间操作返回一个新流。他们总是懒惰;   执行诸如filter()之类的中间操作实际上并不是这样   执行任何过滤,而是创建一个新的流,当时   遍历,包含匹配的初始流的元素   给出谓词。直到管道源的遍历才开始   执行管道的终端操作。

     

终端操作,例如Stream.forEach或IntStream.sum,可以   遍历流以产生结果或副作用。之后   执行终端操作,考虑流管道   消耗,不能再使用;如果你需要遍历相同的   再次数据源,您必须返回数据源才能获得新的数据源   流。

正如它所说,过滤器是一个中间操作,而不是终端。要执行或完成流管道,您必须具有终端操作。因此,Intellij正在提供编译错误。

如果是FadeTransparentsample.reads.stream().count()&amp; sample.reads.stream().toArray() - 两者都是终端操作,因此工作正常。

要解决您的问题,请在Intellij表达式求值程序中执行类似的操作 -

count()

这里,toArray()是终端操作&amp;它会将结果放在sample.reads.stream().filter(s -> s.l.length() < 10).collect(Collectors.toList()); 所述的列表中。