如果我有一个List<List<Object>>,我如何使用Java8的特性将其转换为包含相同迭代顺序的所有对象的List<Object>?


当前回答

List<List>List=map.values().stream().collector(Collectors.toList());

    List<Employee> employees2 = new ArrayList<>();
    
     list.stream().forEach(
             
             n-> employees2.addAll(n));

其他回答

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());

我们可以使用flatmap,请参考以下代码:

 List<Integer> i1= Arrays.asList(1, 2, 3, 4);
 List<Integer> i2= Arrays.asList(5, 6, 7, 8);

 List<List<Integer>> ii= Arrays.asList(i1, i2);
 System.out.println("List<List<Integer>>"+ii);
 List<Integer> flat=ii.stream().flatMap(l-> l.stream()).collect(Collectors.toList());
 System.out.println("Flattened to List<Integer>"+flat);

List<List>List=map.values().stream().collector(Collectors.toList());

    List<Employee> employees2 = new ArrayList<>();
    
     list.stream().forEach(
             
             n-> employees2.addAll(n));

您可以使用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集合的贡献者。