【问题标题】:couldn't use lambda expression to create the ThreadLocal class [duplicate]无法使用 lambda 表达式创建 ThreadLocal 类 [重复]
【发布时间】:2019-03-21 05:10:16
【问题描述】:

我有下面的代码

      ThreadLocal<Map<String, Service<Request, Response>>> connectinonMapThread = new ThreadLocal<Map<String, Service<Request, Response>>>() {
        @Override
        protected Map<String, Service<Request, Response>> initialValue() {
            return new HashMap<String, Service<Request, Response>>();
        }
    };

我想用下面的 lambda 表达式来写 -

ThreadLocal<Map<String, Service<Request, Response>>> connectinonMapThread2 = new ThreadLocal<Map<String, Service<Request, Response>>>(() -> new HashMap<String, Service<Request, Response>>());

我又试了一个。

ThreadLocal<Map<String, Service<Request, Response>>> connectinonMapThread2 = initialValue() -> {

            return new HashMap<String, Service<Request, Response>>();
    };

但我收到编译错误。但 IntelliJ Idea 建议这可以写成 lambda 表达式。

【问题讨论】:

  • diamond operator 使用 Java 已有 4 年了。请使用它。
  • 没有这样的构造函数。使用 withInitial(Supplier) 并在此处提供 lambda。
  • ThreadLocal&lt;Map&lt;String, Service&lt;Request, Response&gt;&gt;&gt; connectionMapThread = ThreadLocal.withInitial(HashMap::new);

标签: java java-8


【解决方案1】:
ThreadLocal<Map<String, Service<Request, Response>>> test = 
            ThreadLocal.withInitial(HashMap::new);

您正在尝试将 lambda 表达式分配给非功能接口,这将不起作用。幸运的是,ThreadLocal 通过withInitial 方法提供了一个Supplier 选项

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多