Class A{
List<Documents> documentList
}
Class Documents{
List<Excel> excels
List<Word> words
List<PowerPoint> ppt
}
现在,如果您只想从文档迭代Excel,那么执行以下操作 .
所以代码就是
List<Document> documentList = new A().getDocumentList();
//check documentList as not null
Optional<Excel> excelOptional = documentList.stream()
.map(doc -> doc.getExcel())
.flatMap(List::stream).findFirst();
if(excelOptional.isPresent()){
Excel exl = optionalExcel.get();
// now get the value what you want.
}
6 回答
正如@Saravana所说:
总而言之,有几种方法可以实现如下相同:
您可以使用flatMap将内部列表(将它们转换为Streams后)展平为单个Stream,然后将结果收集到列表中:
flatmap
更好,但还有其他方法可以实现同样的目标您可以使用Eclipse Collections中的
flatCollect()
模式 .如果您无法从
List
更改列表:注意:我是Eclipse Collections的贡献者 .
Stream
上的flatMap
方法当然可以为这些列表压扁,但必须为元素创建Stream
对象,然后为结果创建Stream
.您不需要所有
Stream
对象 . 以下是执行任务的简单,简洁的代码 .因为
List
是Iterable
,所以此代码调用the forEach method(Java 8特性),它继承自Iterable
.并且
List
的Iterator
按顺序返回项目 .对于
Consumer
,此代码将方法引用(Java 8功能)传递给Java 8之前的方法List.addAll,以按顺序添加内部列表元素 .我只想解释另一个场景,如
List<Documents>
,此列表包含其他文档的列表,如List<Excel>
,List<Word>
,List<PowerPoint>
. 所以结构是现在,如果您只想从文档迭代Excel,那么执行以下操作 .
所以代码就是
我希望这可以在编码时解决某人的问题 .