如何收集清单 列表 在java中使用流?

问题描述 投票:-1回答:3

我有listData (List<String>)getList方法接受String作为参数(例如"java")并返回List<String>(例如["j","a","v","a"])。我需要将这些列表收集到一个列表中。我试过addAll,它工作正常:

List<String> listData = Arrays.asList("java","Stream","laMbdA");
List<String> resultList = new ArrayList<>();

listData.stream()
        .map(this::getList)  // acccepts String as an argument and returns List<String>
        .forEach(resultList::addAll);

如果我尝试Collectors.toList(),我会得到一个List<List<String>>

 listData.stream()
         .map(this::getList)
         .collect(Collectors.toList());

Collectors有什么方法我可以用而不是addAll吗?

java stream java-stream
3个回答
8
投票

你需要flatMap

List<String> resultList =
    listData.stream()
            .flatMap(s -> getList(s).stream())
            .collect(Collectors.toList());

3
投票

仅使用方法引用扩展Eran的答案。因为你在你的帖子中使用方法引用,你也可以做同样的事情,只需在flatMap操作之上链接map

   List<String> resultSet =
                 listData.stream()
                         .map(this::getList)
                         .flatMap(List::stream)
                         .collect(Collectors.toList());

-1
投票

我想下面会帮助你。给出一些解释,“map”返回List,它将成为“resultList”的一个元素。所以你只需要使用toList收集器收集由“map”函数返回的列表。希望对你有所帮助。

public class ListStreamQ {
public static void main(String[] args) {
    List<String> listData = Arrays.asList("java", "Stream", "laMbdA");
    List<Collection<String>> resultList = new ArrayList<>();
    resultList = listData.stream()
            .map(ListStreamQ::getList)
            .collect(Collectors.toList());
    System.out.println(resultList);
}

static List<String> getList(String word){
    return Arrays.asList(word.split(""));
}

}

© www.soinside.com 2019 - 2024. All rights reserved.