Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个流不返回元素?_Java_Jpa_Java 8_Eclipselink_Java Stream - Fatal编程技术网

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;
}