如果在 java 中检查哈希映射键是否存在,如何避免太多

How to avoid too many if while checking hash map key exist or not in java

我映射了用户设置这些字段的位置 nameproductIdproductSerialproductDescproductPrice 因为所有这些都是 optional 在 Java bean 中设置之前的字段我必须检查 key 是否存在并设置值。为实现这一点,我编写了以下代码,但我有太多 if-else 条件无法做到这一点。有人可以建议我们如何在 java 中高效地编写这段代码吗?抱歉,我是 Java 的新手,对于糟糕的编码深表歉意。提前感谢您的帮助。谢谢!

Product.java

public class Product {

    private String name;
    private String productId;
    private String productSerial;
    private String productDesc;
    private String productPrice;
}

Main.java

public class Main {

    public static void main(String[] args) {

        Map<String, String> map = new HashMap<>();
        map.put("name", "iPhone");
        map.put("productId", "2342343");
        map.put("productSerial", "FG44D#KLD");
        map.put("productDesc", "iPhone plus");
        map.put("productPrice", "1500");

        Product product = new Product();

        if (map.containsKey("name")) {
            product.setName((String) map.get("name"));
        } else {
            product.setName("NOT_EXIST");
        }
        if (map.containsKey("productId")) {
            product.setProductId((String) map.get("productId"));
        } else {
            product.setProductId("NOT_EXIST");
        }
        if (map.containsKey("productSerial")) {
            product.setProductSerial((String) map.get("productSerial"));
        } else {
            product.setProductSerial("NOT_EXIST");
        }
        if (map.containsKey("productDesc")) {
            product.setProductDesc((String) map.get("productDesc"));
        } else {
            product.setProductDesc("NOT_EXIST");
        }

        if (map.containsKey("productPrice")) {
            product.setProductPrice((String) map.get("productPrice"));
        } else {
            product.setProductPrice("NOT_EXIST");
        }
    }

}

您需要使用 Map.getOrDefault(key,defValue) 其中 returns 地图中的值或默认值 - 第二个参数。

product.setXYZ(map.getOrDefault("xyz", "NOT_EXIST"));

注意:从JDK1.8开始

您应该使用 Map::getOrDefault 方法,如下所示:

Map<String, String> map = new HashMap<>();
Product product = new Product();
//...
product.setName(map.getOrDefault("name", "NOT_EXIST"));
product.setProductId(map.getOrDefault("productId", "NOT_EXIST"));
product.setProductSerial(map.getOrDefault("productSerial", "NOT_EXIST"))
//...

如果您要设置大量此类属性,那么您也可以考虑使用反射 - 尽管我认为最好尽可能避免使用它。

此外,您不必通过地图转换值 return,因为您指定了地图类型 Map<String,String>,也就是说,您所有的 .get(..).getOrDefault(..) 呼叫总是 return String(或 null)对象 :)