代码之家  ›  专栏  ›  技术社区  ›  Nana Ba

让这个匿名内部类成为lambda

  •  5
  • Nana Ba  · 技术社区  · 7 年前

    下面的代码可以工作,但我收到了SonarLint的通知,因为我在流中使用了匿名类而不是lambda表达式,我不知道如何改进下面的代码以避免通知:

    Properties prop = new Properties();
    Properties temp = new Properties();
    //... add some values and keys in prop and temp
    
    prop.putAll(temp.entrySet().stream()
        .filter( entry -> !prop.containsKey(entry.getKey()))
        .map( new Function<Entry<Object, Object>, Entry<String, String>>(){ 
            @Override
            public Entry<String, String> apply(Entry<Object, Object> entry) {
                return new Entry<String, String>() {
                    @Override
                    public String setValue(String value) {
                        return value.trim().toLowerCase();
                    }
    
                    @Override
                    public String getValue() {
                        return ((String) entry.getValue()).trim().toLowerCase();
                    }
    
                    @Override
                    public String getKey() {
                        return ((String) entry.getKey()).trim().toLowerCase();
                    }
                };
            }
        })
        .collect(Collectors.toMap(Entry<String,String>::getKey, Entry<String,String>::getValue)));
    

    我使用java中的properties类。不幸的是 entrySet Entry<Object, Object> Entry<String, String> 。我想“连接”两个属性对象,将键和值放在小写中。因此,地图允许转换 在里面 Entry<String,String> 这就是为什么,有一个匿名类。

    1 回复  |  直到 7 年前
        1
  •  6
  •   Holger    7 年前

    Sonar建议更换

    prop.putAll(temp.entrySet().stream()
        .filter( entry -> !prop.containsKey(entry.getKey()))
        .map( new Function<Entry<Object, Object>, Entry<String, String>>(){ 
            @Override
            public Entry<String, String> apply(Entry<Object, Object> entry) {
                return new Entry<String, String>() {
                    @Override
                    public String setValue(String value) {
                        return value.trim().toLowerCase();
                    }
    
                    @Override
                    public String getValue() {
                        return ((String) entry.getValue()).trim().toLowerCase();
                    }
    
                    @Override
                    public String getKey() {
                        return ((String) entry.getKey()).trim().toLowerCase();
                    }
                };
            }
        })
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue)));
    

    (我删除了收集器中不必要的类型参数)

    具有

    prop.putAll(temp.entrySet().stream()
        .filter( entry -> !prop.containsKey(entry.getKey()))
        .map(entry -> new Entry<String, String>() { 
            @Override
            public String setValue(String value) {
                return value.trim().toLowerCase();
            }
    
            @Override
            public String getValue() {
                return ((String) entry.getValue()).trim().toLowerCase();
            }
    
            @Override
            public String getKey() {
                return ((String) entry.getKey()).trim().toLowerCase();
            }
        })
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue)));
    

    Function ,不适用于 Entry 实施

    在这里手动接口,特别是不与实际不需要的接口 setValue 方法违反本合同规定。你只想要一个不变的 实例,因此,您可以创建现有类的实例:

    prop.putAll(temp.entrySet().stream()
        .filter( entry -> !prop.containsKey(entry.getKey()))
        .map(entry -> new AbstractMap.SimpleImmutableEntry<>(
            ((String) entry.getKey()).trim().toLowerCase(),
            ((String) entry.getValue()).trim().toLowerCase()))
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue)));
    

    进入 toMap 收藏家:

    prop.putAll(temp.entrySet().stream()
        .filter( entry -> !prop.containsKey(entry.getKey()))
        .collect(Collectors.toMap(
            entry -> ((String) entry.getKey())  .trim().toLowerCase(),
            entry -> ((String) entry.getValue()).trim().toLowerCase())));