【问题标题】:Anonymous Inner class to lambda匿名内部类到 lambda
【发布时间】:2018-07-15 02:56:11
【问题描述】:

在 Sonarcube 中,将以下代码转换为 Lambda 时出现错误,但遇到困难。

private MeterFilter getDefualtConfig() {
        return new MeterFilter() {
            @Override
            public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
                return DistributionStatisticConfig.builder().percentilesHistogram(true).percentiles(0.95, 0.99, .5)
                        .build().merge(config);
            }
        };
    }

【问题讨论】:

  • 好的。你的问题是什么?你试过什么?你面临什么困难?你读过关于 lambdas 的教程和文档吗?
  • @JBNizet,我正在尝试返回 (Meter.Id id, DistributionStatisticConfig config) -> DistributionStatisticConfig.builder().percentilesHistogram(true).percentiles(0.95, 0.99, .5).build() .合并(配置);并且获取该接口的错误目标必须是功能接口
  • MeterFilter 是如何定义的?是接口还是类?如果是类,那么 SonarKube 就有一个 bug:不能使用 lambda 定义类的实例。如果它是一个接口,你的代码应该可以编译。
  • 它是一个接口,但是当我查看它的代码时,所有方法都是静态和默认的,但没有抽象方法
  • 那么你不能使用 lambda 来覆盖它。您只能使用 lamda 实现功能接口,即定义一个且仅一个抽象方法的接口。

标签: lambda java-8


【解决方案1】:

等效的 lambda 表达式是:

return (id, config) -> DistributionStatisticConfig.builder()
                               .percentilesHistogram(true)
                               .percentiles(0.95, 0.99, .5)
                               .build()
                               .merge(config); 

【讨论】:

  • 正确,与我尝试执行此操作的方式类似,但出现错误。该接口的目标必须是功能接口
  • @RavatTailor 如果MeterFilter 是功能接口,即与 SAM 的接口,您只能将上述代码转换为 lambda。如果MeterFilter 确实是一个功能接口,但您仍然收到可以将代码转换为 lambda 的错误,那么很可能是 Sonarcube 的错误。
  • 嘿,谢谢你的回答,Metafilter 不是 SAM 接口,你说得对,看起来像声纳问题