我有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
吗?
答案 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(""));
}
}