繁体   English   中英

带有嵌套对象的 Java8 stream

[英]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 collectList

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM