【问题标题】:Improve performance of mapping values提高映射值的性能
【发布时间】:2023-02-07 00:03:27
【问题描述】:

我有以下代码。我想知道我是否可以提高以下代码的性能。

class CarModel {
    private long carKey;
    private String carName;
    private CarColor carColor;
    private CarEngine carEngine;
}

class CarColor {
    private long carKey;
    private String carPrimaryColor;
    private String carSecondaryColor;
}

class CarEngine {
    private long carKey;
    private String carEnginePartNumber;
    private String carEngineTransmissionFluid;
}

我从只有 carKey 和 carName 的数据库中获取 CarModel 类的值。 然后我获取 CarColor 和 carEngine 的值并对这些列表执行一些数据转换,然后将这些值分配给 CarModel,以便我可以更新数据库中的表。

值到 CarModel 的映射是通过以下方式完成的

private void addList(List<?> list, List<CarModel> carModelList) {
    carModelList.stream().forEach(x -> {
        for (Object object : list) {
            if (object instanceof CarColor
                    && ((CarColor) object).getCarKey() == x.getCarKey()) {
                x.setCarColor(((CarColor) object));
                break;
            }
            if (object instanceof CarEngine
                    && ((CarEngine) object).getCarKey() == x.getCarKey()) {
                x.setCarEngine(((CarEngine) object));
                break;
            }
        }
    });
}

上面的代码有效。有什么方法可以改进 addList() 方法中的代码并使其运行得更快?

任何帮助将不胜感激!感谢您

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    是的,通过将 CarColorCarEngine 对象存储在 Map 数据结构中,并将它们的 carKey 作为键。

    然后,无需重复检查列表,可以从 Map 中检索必要的 CarColorCarEngine 对象,以执行值到 CarModel 的映射。

    这将显着降低时间复杂度,从 O(n2) 到 O(n)。

    就像是:

    void addList(List<?> list, List<CarModel> carModelList) {
        Map<Long, CarColor> colorMap = new HashMap<>();
        Map<Long, CarEngine> engineMap = new HashMap<>();
    
        for (Object object : list) {
            if (object instanceof CarColor) {
                CarColor color = (CarColor) object;
                colorMap.put(color.getCarKey(), color);
            }
            if (object instanceof CarEngine) {
                CarEngine engine = (CarEngine) object;
                engineMap.put(engine.getCarKey(), engine);
            }
        }
    
        carModelList.forEach(x -> {
            CarColor color = colorMap.get(x.getCarKey());
            if (color != null) {
                x.setCarColor(color);
            }
            CarEngine engine = engineMap.get(x.getCarKey());
            if (engine != null) {
                x.setCarEngine(engine);
            }
        });
    }
    

    【讨论】:

      【解决方案2】:

      对于 carModelList 的每个元素,您将完整的 list 迭代一次,这意味着您将拥有n*内部循环迭代,其中ncarModelList 的大小,m 是列表的大小。

      与其遍历carModelList,不如构建一个Map&lt;Long,CarModel&gt;(您可能希望长期保留,可能代替carModelList) 并使用对象carKey 查找CarModel 对象,从而完全消除了外部循环。

      【讨论】:

        【解决方案3】:

        提高此代码性能的一种方法是使用 Map 而不是 List 来将信息存储在“list”参数中。地图的键可以是“carKey”,值可以是“CarColor”或“CarEngine”。然后,您可以使用地图的“get”方法检索“carModelList”中每个“CarModel”的信息。这将消除为每个“CarModel”遍历整个列表的需要。

        这是更新后的代码:

        private void addList(Map<Integer, Object> map, List<CarModel> carModelList) {
          carModelList.stream().forEach(x -> {
            Object object = map.get(x.getCarKey());
            if (object instanceof CarColor) {
             x.setCarColor((CarColor) object);
           } else if (object instanceof CarEngine) {
             x.setCarEngine((CarEngine) object);
          }
          });
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多