【发布时间】:2015-11-03 13:32:06
【问题描述】:
我尝试将以下代码编写为流:
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;
}
【问题讨论】:
-
你能提供一个简短但完整的程序来演示这个问题吗?如果无法重现,就很难诊断。
-
原始代码将获得列表中最后一个匹配项,而流代码将获得第一个。我不知道这是否是这种情况下的问题。
-
"我从 session.getWorkplace.getDevices() 返回的列表中有两个对象" 你确定吗?此外,您的非流解决方案似乎找到了最后一个匹配而不是第一个。
-
如果没有代码就无法回答这个问题,这会让我们重现问题。我们所能做的就是猜测,这不是很有效。请提供SSCCE,否则这个问题可能会被关闭。
-
听起来你程序的其他部分非常很重要,因为它提供了没有被正确读取的数据......如果你回到你的原始代码,那仍然有效吗?
标签: java jpa java-8 eclipselink java-stream