我是新来的Java 8,我需要重写旧的代码来实现新的alghoritm。该任务是过滤它针对每个列表最大速度的对象。列表是嵌套的内部地图:道路的根部地图,其中包含路段的地图和道路段的每个映射包含对象的列表,每一个在一个时间间隔测量decribing速度。我需要找到每个列表中所有的最高速度。
我发现下面的链接,它看起来像我的问题,但我无法适应他们,我不知道我的努力正确地解决我的问题。
这是我作为例子来写我的代码
Map<String, Map<String, Employee>> employeeMap =
employeeMap.entrySet()
.stream()
.collect(toMap(Map.Entry::getKey,
e -> e.getValue().entrySet().stream()
.filter(emp -> !emp.getValue().getState().equals("MI"))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue))));
for(Car car : cars) {
for (Engine engine : car.getEngines()) {
for (Part part : engine.getParts()) {
// ...
}
}
}
cars.stream()
.flatMap(car -> car.getEngines().stream())
.flatMap(engine -> engine.getParts().stream())
.forEach(part -> { ... });
这是我的最终代码
Map<Integer, Map<Integer, List<PartialSpeed>>> speedsPerRoadPerSegment;
ArrayList<PartialSpeed> maxSpeedPerSegment = new ArrayList<PartialSpeed>();
speedsPerRoadPerSegment.entrySet().stream()
.forEach(road-> road.getValue().entrySet()
.stream()
.forEach(segment ->
{
Optional<PartialSpeed> result = segment.getValue().stream()
.max(Comparator.comparing(PartialSpeed::getnVelFfs));
maxSpeedPerSegment.add(result.get());
}));
我所有的努力,坚持榜样会不被认可有关结果类型的问题。这是最好的(不工作)我是已经能够实现:
speedsPerRoadPerSegment.entrySet().stream()
.flatMap(road-> road.getValue().entrySet()
.stream().flatMap(
segment -> segment .getValue()
.stream()
.max(Comparator.comparing(PartialSpeed::getnVelFfs))
));
正如你可以看到我刚刚取代了旧与foreaches循环。我想了解如何直接从lambda表达式获得最大的元素列表。
一般情况下,你是否使用循环或流处理的时候Map
,你应该选择正确的集合视图,keySet()
,entrySet()
,或者values()
,这取决于哪些元素实际需要。由于您只在值感兴趣的话,请不要使用entrySet()
。
然后,应用正确的终端操作流,以获得最终的结果:
List<PartialSpeed> maxSpeedPerSegment =
speedsPerRoadPerSegment.values().stream()
.flatMap(m -> m.values().stream())
.map(list -> Collections.max(list, Comparator.comparing(PartialSpeed::getnVelFfs)))
.collect(Collectors.toList());
此用途Collections.max
,而不是一个嵌套的流操作,如果集合为空时将抛出一个异常(就像调用get()
上的Optional
无条件的都行)。
如果可能发生空列表,你可以前手进行筛选:
List<PartialSpeed> maxSpeedPerSegment =
speedsPerRoadPerSegment.values().stream()
.flatMap(m -> m.values().stream())
.filter(list -> ! list.isEmpty())
.map(list -> Collections.max(list, Comparator.comparing(PartialSpeed::getnVelFfs)))
.collect(Collectors.toList());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句