如何访问注入的构造函数的实例变量 class 在 lambda 中使用

How to access instance variables of a constructor injected class be used inside lambda

客户 class 使用构造函数注入(推荐通过字段注入),但实例字段在 lambda 中不可用。

@Component
public class Customer {

  private final Account account;

  @Autowired
  public Customer(final Account account) {
    this.account = account;
  }

  // Works perfectly fine
  Callable propCallable = new Callable<String>(){
    @Override
    public String call() throws Exception {
        return account.accountId();
    }
  };

  //Shows warning : Variable account might not have been initialized
  Callable lambdaCallable = () -> {
    return account.accountId();
  };
}

我只是想知道是否有更好的方法在 lambda 中使用实例变量,而不是匿名 class?

注意:我更愿意将帐户保留为最终帐户。

提前致谢

lambdaCallable 定义移动到构造函数内部:

private final Callable<Long> lambdaCallable;
@Autowired
public Customer(final Novel account) {
   this.account = account;
   lambdaCallable = account::getId;
}

在匿名 class 和 lambda 之间有一些 differences。在这种情况下,主要的是:

Compilation – Anonymous compiles to a class, while lambda is an invokedynamic instruction

现在关于编译器错误。通过 Java order of initialization rules,您的 lambda 初始化发生在构造函数中的 'account' 赋值之前。不确定,但是由于编译差异,匿名 class 没有这样的错误。

因此,您可以return lambda from 方法,或将'lambdaCallable' 初始化移动到构造函数。

public class DemoApplication {

    public class Customer {

        private final Account account;

        public Customer(final Account account) {
            this.account = account;
        }

        // Works perfectly fine
        Callable propCallable = new Callable<String>(){
            @Override
            public String call() throws Exception {
                return account.accountId();
            }
        };

        Callable getCallable() {
            return account::getId;
        }

//        Callable lambdaCallable = () -> {
//            return account.accountId();
//        };
    }
}