Java 为什么这个流不返回元素?
我试图以流的形式编写以下代码:Java 为什么这个流不返回元素?,java,jpa,java-8,eclipselink,java-stream,Java,Jpa,Java 8,Eclipselink,Java Stream,我试图以流的形式编写以下代码: AbstractDevice myDevice = null; for (AbstractDevice device : session.getWorkplace().getDevices()) { if (device.getPluginconfig().getPluginType().getId() == 1) { myDevice = device; } } 这段代码运行良好 但当我像这样重写它时,它就不起作用了:
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();
我从流中返回的可选
中没有值。为什么?
编辑
当我尝试此操作时(我仍然从getDevices()
获得两台设备):
似乎您正在使用EclipseLink 2.6版本之前的版本,并点击了。此
devices
字段替换为(通过反射),它扩展了Vector
类并执行延迟初始化。它是为没有stream()
方法的较旧Java版本编写的,因此stream()
实际上是在返回空流的未初始化列表上调用的
错误是,因此您可能必须将EclipseLink更新到2.6版本。在EclipseLink 2.6中,另一个类是流友好的。您能提供一个简短但完整的程序来演示这个问题吗?如果不能够复制它,很难进行诊断。原始代码将从列表中获取最后一个匹配项,而流代码将获取第一个匹配项。我不知道这是否是本例中的问题。“我从session.getWorkplace.getDevices()返回的列表中有两个对象”你确定吗?另外,您的非流解决方案似乎找到了最后一个匹配项,而不是第一个匹配项。如果没有代码,我们将无法回答此问题,这将让我们重现问题。我们所能做的就是猜测,这不是很有效。请提供,否则这个问题可能会被关闭。听起来你程序的另一部分很重要,因为它提供的数据没有被正确读取。。。如果你回到你原来的代码,那还能用吗?谢谢!!但不幸的是,在2.6中,当使用@OrderColumn@Swiss_Codeaholic,我明白了。真遗憾。您可以调用类似于
devices.isEmpty()
的函数来强制初始化,但我建议在下一个版本发布之前不要使用流API。是的,我现在放弃了。有点遗憾的是,它仍然不受支持……我的意思是JDK8已经过时一段时间了。无论如何,谢谢你的帮助@Tagir Valeev!谢谢,我使用eclipselink v2.5.0实现了这个精确的行为,但是在2.6.0版本中,这个问题消失了
List<AbstractDevice> testList = session.getWorkplace().getDevices()
.stream().collect(Collectors.toList());
@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;
}