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

Adr*_*ebs 6 java jpa eclipselink java-8 java-stream

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

AbstractDevice myDevice = null;

for (AbstractDevice device : session.getWorkplace().getDevices()) {

    if (device.getPluginconfig().getPluginType().getId() == 1) {
        myDevice =  device;
    }

}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.

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

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

Optional它我回来从流没有值.为什么?

编辑

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

 List<AbstractDevice> testList = session.getWorkplace().getDevices()
                                        .stream().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

Tag*_*eev 7

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

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