【问题标题】:Java error Cannot resolve method 'map' in 'List' [closed]Java错误无法解析“列表”中的方法“地图”[关闭]
【发布时间】:2020-09-27 03:02:20
【问题描述】:

我正在尝试为 CRUD 应用程序使用 Java 后端。我正在使用 Java 1.8。我使用了 findByName(name) [下] 的以下实现。 Intellij 说有错误,因为“无法解析 'List' 中的方法 'map'”。这是否意味着Java确实有map方法?我该如何克服这一点。我一直在尝试在流等之前添加,但它没有帮助。我还希望在 findByName 中返回设备,并且通过一些尝试过的解决方案,错误正在从 map 方法移动到返回设备。我会很感激你的帮助,因为我无法完成,它让我彻夜难眠。

return deviceRepository.findByName(name).map(device -> {
        LOG.info("Reading device with name " + name + " from database.");
        return device;
    }).orElseThrow(() -> new DeviceNotFoundException("The device with the name " + name + " couldn't be found in the database."));
}

【问题讨论】:

    标签: java list dictionary crud


    【解决方案1】:

    这是否意味着Java确实有map方法?

    没有。这意味着List 接口没有map 方法。您可以自行查看javadocs 以确认这一点。

    我该如何克服这个问题。

    所以看起来您的代码旨在搜索列表,然后编写日志消息并返回一个元素,或者引发异常。

    这有一个非常基本的问题。 findByName(name) 方法显然可以返回多个“设备”。所以你的代码必须决定在这种情况下做什么。

    这是一种可能的解决方案:

    List<Device> found = deviceRepository.findByName(name);
    if (found.size() == 0) {
        throw new DeviceNotFoundException("The device with the name " + name + 
                                          " couldn't be found in the database.");
    } else if (found.size() > 1) {
        throw new DeviceNotFoundException("Multiple devices with name " + name + 
                                          " found in the database.");
    } else {
        LOG.info("Reading device with name " + name + " from database.");
        return found.get(0);
    }
    

    其他可能性是忽略多个设备具有相同名称的情况(并且只返回第一个),或者更改findByName API 以仅返回一个设备。

    【讨论】:

      【解决方案2】:

      Java 的列表没有 map 方法,而且从来没有。对于一个列表来说,有一个名为orElseThrow 的方法也非常奇怪——也许应该是ifEmptyThrow?这也不存在,但至少这是有道理的。或者findByName是一个可能找到结果也可能找不到结果的操作,如果没有结果,map应该是空操作,如果没有找到结果,则调用orElseThrow

      'deviceRepository',也不是 findByName,是可识别的,这没有帮助。

      如果findByName 返回List&lt;Device&gt;,Java 不会让尝试以流方式进入“如果为空”变得简单。

      如果 findByName 应该返回 1 个或 0 个元素,如果它返回一个 Optional,则粘贴的代码将起作用。这让我认为它没有。

      剩下的就是:别再把鞋后跟当作通用工具了。这是一款不错的鞋子,非常适合走路,但不适合钉子。这是如何做到的。清楚的。很简单。

      List<Device> devices = deviceRepository.findByName(name);
      if (devices.isEmpty()) throw new DeviceNotFoundException("The device with name + " name + " couldn't be found in the database");
      LOG.info("Reading device with name {} from the database", name");
      

      【讨论】:

      • 非常感谢,这对您有所帮助。你对鞋子的比喻是对的,我正在努力获得更好的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 2022-10-21
      • 2022-07-06
      • 2021-03-03
      • 2018-01-15
      • 1970-01-01
      • 2022-09-17
      相关资源
      最近更新 更多