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

时间:2015-08-11 10:53:15

标签: java jpa java-8 eclipselink java-stream

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

 <table>
     <tr ng-show="condition1" >
       <td>test1 </td><td>some value</td>
    </tr> 
    <tr ng-show="condition1" >
       <td>test2</td><td>some value</td>
   </tr> 
    <tr ng-show="condition2" >
       <td>test3</td><td>some value</td>
   </tr> 
    <tr ng-show="condition2" >
       <td>test4</td><td>some value</td>
    </tr> 
    <tr ng-show="condition2" >
       <td>test5</td><td>some value</td>
    </tr> 
    <tr ng-show="condition2" >
          <td>test6</td><td>some value</td>
   </tr> 
</table>

此代码工作正常。

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

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设备流似乎出了问题?

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

List

1 个答案:

答案 0 :(得分:7)

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

错误是fixed,因此您可能必须将EclipseLink更新为2.6版本。在EclipseLink 2.6中,另一个类是used when running on JDK 1.8,它是流友好的。