如何使用java中的流收集List <string>到List <string>?

时间:2018-01-03 08:44:44

标签: java stream java-stream

我有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吗?

3 个答案:

答案 0 :(得分:8)

您需要flatMap

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

答案 1 :(得分:3)

仅使用方法参考扩展Eran的答案。由于您在帖子中使用了方法引用,因此您也可以执行相同操作,并在flatMap操作之上链接map

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

答案 2 :(得分:-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(""));
}

}