如果我有一个List<List<Object>>,我如何使用Java8的特性将其转换为包含相同迭代顺序的所有对象的List<Object>?
当前回答
您可以使用flatMap将内部列表(在将其转换为流之后)展平为单个流,然后将结果收集到列表中:
List<List<Object>> list = ...
List<Object> flat =
list.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
其他回答
我只想再解释一个场景,如列表<文档>,此列表包含其他文档的列表,如列表>Excel>、列表<Word>、列表>PowerPoint>。所以结构是
class A {
List<Documents> documentList;
}
class Documents {
List<Excel> excels;
List<Word> words;
List<PowerPoint> ppt;
}
现在,如果您只想从文档中迭代Excel,请执行以下操作。。
所以代码应该是
List<Documents> 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.
}
我希望这可以在编码时解决某人的问题。。。
Stream上的flatMap方法当然可以为您展平这些列表,但它必须为元素创建Stream对象,然后为结果创建Stream。
您不需要所有这些Stream对象。下面是执行任务的简单、简洁的代码。
// listOfLists is a List<List<Object>>.
List<Object> result = new ArrayList<>();
listOfLists.forEach(result::addAll);
因为List是Iterable的,所以这段代码调用forEach方法(Java8特性),它继承自Iterable。
对Iterable的每个元素执行给定的操作,直到处理完所有元素或该操作引发异常。如果指定了迭代顺序,则按迭代顺序执行操作。
列表的迭代器按顺序返回项目。
对于Consumer,此代码将方法引用(Java 8特性)传递给Java 8之前的方法List.addAll,以顺序添加内部列表元素。
按照指定集合的迭代器返回的顺序,将指定集合中的所有元素追加到此列表的末尾(可选操作)。
您可以使用flatMap将内部列表(在将其转换为流之后)展平为单个流,然后将结果收集到列表中:
List<List<Object>> list = ...
List<Object> flat =
list.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
以下代码应有效:-
List<Object> result = new ArrayList<>();
listOfLists.forEach(result::addAll);
您可以使用Eclipse集合中的flatCollect()模式。
MutableList<List<Object>> list = Lists.mutable.empty();
MutableList<Object> flat = list.flatCollect(each -> each);
如果无法从列表中更改列表:
List<List<Object>> list = new ArrayList<>();
List<Object> flat = ListAdapter.adapt(list).flatCollect(each -> each);
注意:我是Eclipse集合的贡献者。
推荐文章
- Java中枚举的命名:单数还是复数?
- JavaBean和POJO之间的区别是什么?
- 注释在Java中如何使用,在哪里使用?
- 如何在Ubuntu下安装JDK 11 ?
- Spring Boot -无法确定数据库类型为NONE的嵌入式数据库驱动程序类
- 如何转换/解析从字符串到字符在java?
- 如何在Android中动态更改菜单项文本
- 如何比较两个没有时间部分的日期?
- 有没有一种方法可以获得Rails应用程序中所有模型的集合?
- 如何在Java中找到给定类的所有子类?
- 匿名类的访问构造函数
- 从Java访问Kotlin扩展函数
- 解析LocalDateTime时无法从TemporalAccessor获取LocalDateTime (Java 8)
- 以AM/PM的12小时格式显示当前时间
- 求两个集合的差值