当前位置: 首页 > 知识库问答 >
问题:

从嵌套在具有lambda的嵌套贴图中的一组列表中构建最大值列表

程和煦
2023-03-14

我是Java8新手,需要重写一段旧代码来实现一个新的alghoritm。任务是过滤每个列表具有最大速度的对象。列表嵌套在地图中:道路的根地图,其中包含道路段的地图,每个道路段的地图包含对象列表,每个对象以时间间隔降低测量的速度。我需要找到每个列表的所有最大速度。

我发现以下链接看起来像我的问题,但我不能适应他们,我不确定我的尝试解决我的问题正确。

如何使用Java8流和过滤器过滤嵌套循环?

Java8滤镜图

地图上的过滤器

这是我作为示例编写的代码


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 -> {  ... });


这是我的结果代码

java prettyprint-override">

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))
                                    ));

正如你所看到的,我刚刚用前肢代替了旧的for循环。我想了解如何直接从lambda表达式获取最大元素列表。

共有1个答案

宋健柏
2023-03-14

一般来说,无论您使用循环还是流,在处理Map时,您都应该选择正确的集合视图,keySet()entrySet()值(),这取决于您实际需要的元素...因为您只对值感兴趣,所以不要使用entrySet()

然后,对流应用正确的终端操作,以获得最终结果:

List<PartialSpeed> maxSpeedPerSegment =
    speedsPerRoadPerSegment.values().stream()
        .flatMap(m -> m.values().stream())
        .map(list -> Collections.max(list, Comparator.comparing(PartialSpeed::getnVelFfs)))
        .collect(Collectors.toList());

这使用集合。max而不是嵌套流操作,该操作将在集合为空时引发异常(就像在可选上无条件调用get()一样)。

如果可能出现空列表,您可以先筛选它们:

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());

 类似资料:
  • 本文向大家介绍在Python中给定的嵌套列表中找到具有最大值的子列表,包括了在Python中给定的嵌套列表中找到具有最大值的子列表的使用技巧和注意事项,需要的朋友参考一下 列表可以包含其他列表作为其元素。在本文中,我们等于找到给定列表中存在的具有最大值的子列表。 带有max和lambda max和Lambda函数可以一起使用,以给出具有最大值的子列表。 示例 输出结果 运行上面的代码给我们以下结果

  • 问题内容: 我有一个这样的清单: 如果仅使用该方法,它将返回答案,如果我试图找到max name ,那将是正确的,但是我试图返回其整数最大的元素。 问题答案: 之所以起作用,是因为 max 函数的 key 参数指定了一个函数,当 max 想要知道用于搜索最大元素的值时,该函数将被调用。 max 将为序列中的每个元素调用该函数。并创建一个接收列表并返回第一个(从零开始计数)元素的小函数。所以 __

  • 问题内容: 试图了解如何在Firebase中实现嵌套列表。 可以解决的问题:1-to-N消息传递系统,对于每个消息,您希望维护一个已接收和阅读该消息的用户列表。 阅读了“ Firebase中阵列的最佳实践”。尝试避免使用数组,因为我要同时进行写操作,而在这里看来它们并不是一个好选择。 当前试图通过在每个消息下存储子树来实现此目的,每个子树是已接收,读取或以其他方式对消息 Y 执行某些操作 X 的用

  • 我想,结果应该是1、2、3。 这里怎么了?

  • 我有一个类似这样的组对象 和如下所示的Item对象

  • 问题内容: 我了解简单列表理解的工作原理,例如: 而且我也了解嵌套列表的综合工作原理: 所以,当我尝试这样做 我期望这样: 但是我得到了: 所以我有更好的方法解决问题,这给了我我想要的 但是我不明白在第一个代码中返回9个元素 问题答案: 它有9个数字的原因是因为python对待 类似于 即,它是一个嵌套循环