猿问

在地图中提取值

我们有一张地图 Students { studentId : StudentData }。
StudentData 是一个具有学生属性的 POJO。
要求是让所有学生都具有 attribute isCurrent==true
如果是,则提取学生的城市属性。
这将用于增加 studentpercity 地图的计数{ city : count }

Students.entrySet()
                .stream()
                .filter(x -> true == x.getValue().isCurrent())
                .forEach(x -> {
                      studentpercity(x.getValue().getCity(), (studentpercity.getOrDefault(x.getValue().getCity(), 0) + 1));
                      });

最终输出将是一张城市地图,以计算“当前”学生的数量。
有没有更有效的方法来实现这一目标?


青春有我
浏览 98回答 2
2回答

宝慕林4294392

你可以这样做,Map<String,&nbsp;Long>&nbsp;studentPerCity&nbsp;=&nbsp;students.values().stream().filter(StudentData::isCurrent) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.groupingBy(StudentData::getCity,&nbsp;Collectors.counting()));

摇曳的蔷薇

另一种选择可能是这样的:students.values().stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(StudenData::isCurrent) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(StudenData::getCity) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(city&nbsp;->&nbsp;studentpercity(city,&nbsp;studentpercity.getOrDefault(city,&nbsp;0)&nbsp;+&nbsp;1));但是,关于您对“迭代”的评论。在单个流中(如您的示例),每个元素仅迭代一次。这意味着流中的每个操作都将在每个元素上应用一次,并且只有在之前没有被过滤掉的情况下才会应用。
随时随地看视频慕课网APP

相关分类

Java
我要回答