【问题标题】:What is the optimal way to check if a map contains any empty values or keys?检查地图是否包含任何空值或键的最佳方法是什么?
【发布时间】:2021-05-26 19:13:41
【问题描述】:

我有一张地图,其中存储了一组问题和答案。不能有空答案的问题或空问题的答案。下面是我如何初始化我的地图。

Optional<Map<String, String>> questionsAndAnswers();

我正在通过以下方式验证问题/答案的空字符串。

questionsAndAnswers().ifPresent(questionsAndAnswers -> {
        if (questionsAndAnswers.isEmpty()) {
            throw new IllegalArgumentException("questions cannot be empty if present");
        } else if (questionsAndAnswers.keySet().contains("") || questionsAndAnswers.values().contains("")) {
            throw new IllegalArgumentException("Questions or answers cannot be empty");
        }
    });

有没有更好的方法来实现这一点?任何建议将不胜感激。

更新:我没有特别需要在两个不同的条件下完成这些检查。

【问题讨论】:

  • 您可以不首先存储空的问题/答案。我知道我要偏离正题了。我只是想确认一下。
  • 这是一个库包的一部分,我会将这里收集的数据传递给另一个 API。所以我想确保我最终不会将任何空问题或答案传递给该 API :)
  • 所以空地图是个问题,但是空的可选项,根本不包含地图,可以吗?为什么这个方法返回一个可选项?
  • 此地图包含问题和答案。不传递它们很好,在这种情况下,我将使用默认值。但是,如果用户决定提供自己的一组问题和答案,他们不应该将任何问题或答案留空。希望这是有道理的

标签: java java-8 maps optional is-empty


【解决方案1】:

你可以试试下面

    questionsAndAnswers().ifPresent(qna -> {
        if (qna.isEmpty() || qna.containsKey("") || qna.containsValue("")) {
            throw new IllegalArgumentException("Error Message Comes Here");
        }
    });

【讨论】:

  • 谢谢你的回答,我没有意识到有 containsKey 和 containsValue 方法!
【解决方案2】:

questionsAndAnswers().ifPresent(ConcurrentHashMap::new); 如果有任何空键/值,则抛出 NullPointerException

【讨论】:

  • 空字符串不为空。
  • 谢谢你的回答,我还要注意空字符串
  • 还有多种方法可以识别空字符串。检查 String.isEmpty() 与 String.isBlank()。
【解决方案3】:

你抛出了两个不同的异常,所以空地图和地图的空条目之间肯定有区别。

第二个是否应该检查,键或值是否为空或空:

questionsAndAnswers().ifPresent(pMap -> {
            if(pMap.isEmpty())
                throw new IllegalArgumentException();
            
            if(pMap.keySet().stream().anyMatch(pKey -> pKey == null || pKey.trim().isEmpty())
                    || pMap.values().stream().anyMatch(pValue -> pValue == null || pValue.trim().isEmpty()))
                throw new IllegalArgumentException();
        });

编辑: 对于字符串,您可以使用 Apache Commons:https://stackoverflow.com/a/14721575/11050826

【讨论】:

  • 感谢您的回答,我更新了它以反映它不必是两个不同的条件:) 抱歉没有具体说明
  • 那么你当然可以将这两个 if 结合起来。但我没有看到更简单的方法,如果你想检查它是否不为空且不为空
  • 嗯,有道理
【解决方案4】:

首先:您上面显示的代码包含一些语法错误。可能您的 IDE 或编译器会帮助您解决这个问题。

您的地图存储键/值对,其中键或值是问题,另一个是答案。您要求的是不能存在空键或空值。

您可以遍历地图并查找具有空值的条目。你将如何处理它们仍然取决于你......

for (Map.Entry<String, String> entry: questionsAndAnswers) {
    if (entry.getValue()==null || entry.getValue().isBlank()) {
        // here do what you need to do with an emty value
        // removing that from the map may be thrilling while you loop over it
    }
}

一旦解决了,您可能需要关心空问题或空问题。文档说“将键映射到值的对象。映射不能包含重复的键;每个键最多可以映射到一个值。”这意味着最多有一个空问题。要找到它,您只需这样做

questionsAndAnswers.get(null); // unlikely to reveal anything at all
questionsAndAnswers.get("");   // there you go, now put this answer again with the
                               // right question. 
questionsAndAnswers.remove();  // finally remove the empty question from the map

【讨论】:

  • 非常感谢您的回答。我想找出一种不使用循环且行数最少的方法,尤其是使用 Java 8 API 的任何更简单的方法:)
猜你喜欢
  • 2015-08-23
  • 2011-06-04
  • 1970-01-01
  • 2021-02-18
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多