Java 8, Lambda : 用 lambda 替换 Anonymous inner class

2022-09-01 06:07:29

我有一个包含以下内容的类:

List roles = ldapTemplate.search(baseDn, replaceFilter, sc,
            new AttributesMapper() {
                public Object mapFromAttributes(Attributes attrs)
                        throws NamingException {
                    return attrs.get("cn").get();
                }
            });

IntelliJ 告诉我用 lambda 替换匿名内部类。所以我尝试了:

List roles = ldapTemplate.search(
    baseDn, replaceFilter, sc,
    (Attributes a)  -> { return a.get("cn").get(); };
);

但是,我收到编译错误:

Error:(46, 50) java: incompatible types: inference variable T has incompatible bounds
    equality constraints: java.lang.String
    lower bounds: java.lang.Object

我找不到这个问题的解决方案。你有什么想法吗?


答案 1

一个简单的 Azure 存储实体解析程序接口及其实现的方法:

EntityResolver<String> orderNumberResolver = new EntityResolver<String>() {
    @Override
    public String resolve(String partitionKey, String rowKey, Date timeStamp,
        HashMap<String, EntityProperty> properties, String etag) {
      return properties.get("SomeColumnName").getValueAsString();
    }
  };

上述方法的λ将是:

 EntityResolver<String> orderNumberResolver = (
          partitionKey, rowKey, timeStamp, properties, etag
      ) -> properties.get("SomeColumnName").getValueAsString();

从上面的例子中可以清楚地看出,lambda足够聪明,可以根据它们的匿名内部类来处理方法参数的类型,因此它使重写方法的实现变得容易。希望这会有所帮助。


答案 2

试试这个(删除多余的分号)

List roles = ldapTemplate.search(
    baseDn, replaceFilter, sc,
    (Attributes a)  -> { return a.get("cn").get(); }            
);

推荐