【问题标题】:Constructing list from multi level map in Java 8在 Java 8 中从多级映射构造列表
【发布时间】:2019-06-11 06:16:01
【问题描述】:

我有一个多级地图如下:

 Map<String, Map<String, Student> outerMap = 
    {"cls1" : {"xyz" : Student(rollNumber=1, name="test1")}, 
     "cls2" : {"abc" : Student(rollNumber=2, name="test2")}}

现在我想从上面的地图构造一个字符串列表,如下所示:

["In class cls1 xyz with roll number 1",
 "In class cls2 abc with roll number 2"] 

我写了如下,但这不起作用,在这种情况下,我也浏览了帖子:Java 8 Streams - Nested Maps to List,但没有太多想法。

 List<String> classes = outerMap.keySet();
 List<String> studentList = classes.stream()
      .map(cls -> 
           outerMap.get(cls).keySet().stream()
           .map(student -> "In class "+ cls +
            student + " with roll number " +
            outerMap.get(cls).get(student).getRollNum() +"\n"
            ).collect(Collectors.toList());

【问题讨论】:

    标签: java list java-8 hashmap


    【解决方案1】:

    您可以简单地将Map.forEach 用于此操作:

    List<String> messages = new ArrayList<>();
    outerMap.forEach((cls, students) ->
            students.forEach((name, student) -> 
                    messages.add(convertToMessage(cls, name, student.getRollNumber()))));
    

    其中convertToMessage 是一个实用程序:

    // this could be made cleaner using 'format'
    String convertToMessage(String cls, String studentName, String rollNumber) {
        return "In class" + cls + "--> " + studentName + " with roll number: " + rollNumber;
    }
    

    【讨论】:

      【解决方案2】:

      你可以这样做,

      List<String> formattedOutput = outerMap
          .entrySet().stream()
          .flatMap(e -> e.getValue().entrySet().stream().map(se -> "In class " + e.getKey()
              + " " + se.getKey() + " with roll number " + se.getValue().getRollNumber()))
          .collect(Collectors.toList());
      

      您必须使用flatMap 运算符而不是map 运算符。

      【讨论】:

        【解决方案3】:

        一种方法使用 Java 8 Stream 和 lambda 函数:

        String format = "In class %s %s with roll number %d";
        List<String> result = new ArrayList<>();
        outerMap.entrySet().stream()
            .forEach(v -> {
                String className = v.getKey();
                v.getValue().entrySet().stream()
                    .forEach(stringStudentEntry -> result.add(String.format(format,className,stringStudentEntry.getKey(),stringStudentEntry.getValue().getRollNumber())));
            });
        

        【讨论】:

          猜你喜欢
          • 2016-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-11
          • 2016-02-12
          相关资源
          最近更新 更多