为什么这个流没有返回元素?

我尝试将以下代码编写为流:

AbstractDevice myDevice = null; for (AbstractDevice device : session.getWorkplace().getDevices()) { if (device.getPluginconfig().getPluginType().getId() == 1) { myDevice = device; } } 

这段代码工作正常。

但是当我像这样重写它时它不再起作用了:

 myDevice = session.getWorkplace().getDevices().stream() .filter(s -> s.getPluginconfig().getPluginType().getId() == 1) .findFirst().get(); 

我从流中返回的Optional没有值。 为什么?

编辑

当我尝试这个时(我仍然从getDevices()获得两个设备):

  List testList = session.getWorkplace().getDevices() .stream().collect(Collectors.toList()); 

testList为空。 所以我的设备List流似乎出了问题?

它是一个JavaEE应用程序,我从相应的实体获取我的设备:

 @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) @JoinTable(name = "Workplace_AbstractDevice", joinColumns = { @JoinColumn(name = "Workplace", referencedColumnName = "ID") }, inverseJoinColumns = { @JoinColumn(name = "AbstractDevice", referencedColumnName = "ID") }) @OrderColumn private List devices = new ArrayList(); public List getDevices() { return devices; } 

似乎您在2.6版本之前使用EclipseLink并且遇到Bug#433075 。 此devices字段由IndirectList (通过reflection)替换,后者扩展Vector类并执行延迟初始化。 它是为没有stream()方法的旧Java版本编写的,因此实际上在未初始化列表上调用stream()返回空流。

该错误已得到修复 ,因此您可能必须将EclipseLink更新为2.6版本。 在EclipseLink 2.6中,在JDK 1.8上运行时使用另一个类,它是流友好的。