我试图将以下代码编写为流:
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<AbstractDevice> 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<AbstractDevice> devices = new ArrayList<AbstractDevice>();
public List<AbstractDevice> getDevices() {
return devices;
}
似乎您正在使用2.6之前的EclipseLink,并遇到了Bug#433075。该devices
字段被替换IndirectList
(通过反射),该扩展了Vector
类并执行了延迟初始化。它是为较旧的Java版本编写的,该版本没有stream()
方法,因此stream()
实际上是在未初始化的列表上调用并返回空流的。
该错误已修复,因此您可能必须将EclipseLink更新为2.6版本。在EclipseLink 2.6中,当在对流友好的JDK 1.8上运行时,会使用另一个类。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句