如何使用Java8流将列表的列表转换为单个列表

5

如何使用Stream将以下代码转换而不使用 for each 循环。

  1. getAllSubjects() 返回所有列表,每个主题都有一个 List<Topic>。所有列表应合并为 List<Topic>
  2. 需要从 List<Topic> 中获取 Map<id,topicName>

对象模型:

Subject
  id,....
  List<Topic>
Topic
  id,name

public Map<String, String> getSubjectIdAndName(final String subjectId) {

    List<Subject> list = getAllSubjects(); // api method returns all subjects
    //NEEDS TO IMPROVE CODE USING STREAMS
    list = list.stream().filter(e -> e.getId().equals(subjectId)).collect(Collectors.toList());
    List<Topic> topicList = new ArrayList<>();
    for (Subject s : list) {
        List<Topic> tlist = s.getTopics();
        topicList.addAll(tlist);
    }
    return topicList.stream().collect(Collectors.toMap(Topic::getId, Topic::getName));

}

请展示你的尝试。 - Flown
8
只需将这些中间集合转换为List,然后学习flatMap,就可以完成了。换句话说,return getAllSubjects() .stream() .filter(e -> e.getId().equals(subjectId)) .flatMap(s -> s.getTopics().stream()) .collect(Collectors.toMap(Topic::getId, Topic::getName)); - Holger
@Holger 看起来更像是答案而不是评论。 ;) - Peter Lawrey
谢谢@Holger - Lakshman Miani
1个回答

9

在这里使用flatMap,避免再次流式处理。请注意,此toMap假定没有重复的键(或null值)。

list.stream()
    .filter(e -> subjectId.equals(e.getId()))
    .flatMap(subject -> subject.getTopics().stream())
    .collect(Collectors.toMap(Topic::getId, Topic::getName));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接