由于某些原因,我无法理解如何使用流将这个深度嵌套的列表转换为新的列表。
every A in List<A> contains ->
List<B> where every B contains ->
List<C> where every C contains -> List<String>
我尝试了很多不同的迭代,比如:
List<String> newlist = listA.getB()
.stream()
.filter(b -> b.getC()
.stream()
.filter(c -> c.getPeople)
.collect(Collectors.toList())
您应该使用flatmap
:
List<String> newList =
listA.stream() // Stream<A>
.flatMap(a->a.getB().stream()) // Stream<B>
.flatMap(b->b.getC().stream()) // Stream<C>
.flatMap(c->c.gtPeople().stream()) // Stream<String>
.collect(Collectors.toList()); // List<String>
我得到了同样的错误。这有可能吗?我真的更希望不执行stream.foreach()并传递一个消费者。 编辑:对我来说,不要复制元素是很重要的。
我在Mac上安装了最新的Java8和最新的Android Studio。在Android Studio中我找不到java.util.function。这使我相信它没有使用Java8。我已经搜索了一个日志时间,我的Mac上唯一的Java是Java8。我还检查了项目结构,它指向Java8。我重新安装了Android Studio,创建了一个新项目,但我仍然无法导入java.util.function。
我有一段代码,看起来像这样。 我读到了两个相互矛盾的(?)关于这一点的“规则”。 那是不应有副作用 那是不应更新可变变量(因此,如果我重构以使用foreach并填充结果列表,则会打破这一点),如中所述http://files.zeroturnaround.com/pdf/zt_java8_streams_cheat_sheet.pdf 我如何解决它,以便使用流并仍然返回一个列表,或者干脆跳过流?
假设我有一个实现下面接口的对象列表: 假设我也有一个类,它能够对这些对象进行求和: 我在玩一个自定义收集器,但无法找到一些整洁的解决方案。