[英]Java8 stream with nested objects
所以我是Java8的新手。 我读过有关流的内容,但大多数示例都是非常基本的。 我想知道如何处理嵌套对象。 这是我的代码中的一个示例:
for (Gas gas : gases) {
resourceNodes.add(gas.getRefinery().unit());
}
似乎我应该能够用 stream 将其单线化,但我不太明白。 有人可以用 stream 提供答案吗? 有没有办法在嵌套方法中使用:: 语法?
编辑:为了澄清示例,getRefinery() 返回类型为:UnitInPool 的 object,其方法 unit() 返回类型为:Unit 的 object。 resourceNodes 是 Unit 的 ArrayList。
您引用的::
语法就是所谓的方法引用。
假设在 for 循环之前resourceNodes
未分配(或为空,在这种情况下您可以删除任何先前的分配),那么您首先需要将map
每个Gas
转换为unit()
返回的任何类型,然后将Stream
collect
到List
:
resourceNodes = gases.stream()
.map(Gas::getRefinery)
.map(GasRefinery::unit)
.collect(Collectors.toList());
否则,如果您的目标是简单地添加到resourceNodes
,那么它会非常相似:
resourceNodes.addAll(gases.stream()
.map(Gas::getRefinery)
.map(GasRefinery::unit)
.collect(Collectors.toList()));
您需要提供更多代码以获得合理的答案,但我猜您可以获得 stream 单位,无论这些是(以及无论getRefinery
返回什么):
gases.stream().map(Gas::getRefinery).map(???::unit)
然后您可以例如使用collect(Collectors.toList())
收集结果,然后使用收集的结果作为参数调用resourceNodes.addAll
resourceNodes = gases.stream().map(gas -> gas.getRefinery().unit()).collect(Collectors.toList());
如果你只想要方法引用,你可以使用这个:
gases.stream().map(Gas::getRefinery).map(UnitInPool::unit).map(resourceNodes::add);
or
gases.stream().map(Gas::getRefinery).map(UnitInPool::unit).forEach(resourceNodes::add);
否则,lambda 可能会更好,因为它更短且更具可读性,并且在您拥有采用多个参数或需要执行多个复杂操作的方法时有效。
gases.stream().forEach(g -> resourceNodes.add(g.getRefinery().unit()));
这与您之前的代码基本相同,但我建议使用 for 循环。
欢迎来到 SO 社区。 我希望以下内容有所帮助。
List<Unit> resourceNodes = gases.stream() // open a stream
.map(gas -> gas.getRefinery()) // convert to UnitInPool
.filter(unitInPool -> Objects.nonNull(unitInPool)) // null check to avoid NPE
.map(unip -> unip.getUnit()) // convert to Unit
.collect(Collectors.toList()) // collect all the values in a List
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.