如何将参数化匿名类转换为lambda?

时间:2017-03-03 15:18:49

标签: java lambda java-8

我想重构我的代码(Sonar也希望我这样做:))。

我应该使用lambda而不是匿名类。

我有以下代码:

@Component
public class InsuranceValidateRespDataToDtoMapper extends PropertyMapConfigurerSupport<InsuranceValidateResponseData,
        com.package.InsuranceValidateResponseData> {

    @Override
    public PropertyMap<InsuranceValidateResponseData, com.package.InsuranceValidateResponseData> mapping() {
        return new PropertyMap<InsuranceValidateResponseData, com.package.InsuranceValidateResponseData>() {
            @Override
            protected void configure() {
                using(BIG_DECIMAL_TO_INTEGER_AMOUNT_CONVERTER).map(source.getLackCurr()).setLackCurr(null);
                using(BIG_DECIMAL_TO_INTEGER_AMOUNT_CONVERTER).map(source.getLackEur()).setLackEur(null);
            }
        };
    }
}

当我进行以下更改时,代码将无法编译。

@Component
public class InsuranceValidateRespDataToDtoMapper extends PropertyMapConfigurerSupport<InsuranceValidateResponseData,
        com.package.InsuranceValidateResponseData> {

    @Override
    public PropertyMap<InsuranceValidateResponseData, com.package.InsuranceValidateResponseData> mapping() {
        return () -> {
            using(BIG_DECIMAL_TO_INTEGER_AMOUNT_CONVERTER).map(source.getLackCurr()).setLackCurr(null);
            using(BIG_DECIMAL_TO_INTEGER_AMOUNT_CONVERTER).map(source.getLackEur()).setLackEur(null);
        };
    }
}

编译失败,因为它无法解析“using”和“source”

2 个答案:

答案 0 :(得分:4)

下面:

return new PropertyMap<InsuranceValidateResponseData, com.package.InsuranceValidateResponseData>() {
return () -> {
        using(BIG_DECIMAL_TO_INTEGER_AMOUNT_CONVERTER).map(source.getLackCurr()).setLackCurr(null);
        using(BIG_DECIMAL_TO_INTEGER_AMOUNT_CONVERTER).map(source.getLackEur()).setLackEur(null);
    };
}

那里有两个回报 - 没有意义;去那第二个

return -> { ... }

仅;并删除你面前的其他东西!

更多重要方面在这里:不要盲目地做 因为某些工具告诉你这样做。

相反:退一步; 了解该工具告诉您的内容(例如:有哪些选项;您是否真的购买“其他选项比您现在拥有的更好”)。当然,如果每个人都同意“我们想要0 SonarQube警告”,那么这就是你能做的。另一方面;触摸代码时;如上所述:不要盲目地做。也许你可以退后一步;甚至在这里进行更好重构。

(我不是说这在这里是可行的;我只是指出:当你触摸你的代码时;确保你提交的改变对你来说真的很有意义。)

答案 1 :(得分:1)

如果PropertyMap是功能界面

,请尝试重写这样的方法
@Override
public PropertyMap<InsuranceValidateResponseData, com.package.InsuranceValidateResponseData> mapping() {
    return () -> {
        using(BIG_DECIMAL_TO_INTEGER_AMOUNT_CONVERTER).map(source.getLackCurr()).setLackCurr(null);
        using(BIG_DECIMAL_TO_INTEGER_AMOUNT_CONVERTER).map(source.getLackEur()).setLackEur(null);
    };
}

功能接口可以表示为lambda函数,在这种情况下,您只需要从功能接口为该单个方法编写lambda函数。 BiConsumer class的简单示例:

BiConsumer<String, String> getConsumer() {
    return new BiConsumer<String, String>() {
        @Override
        public void accept(String s, String s2) {
            // accept strings
        }
    };
}

可以表示为lambda函数,仅指定accept方法:

BiConsumer<String, String> getConsumer() {
    return (s, s2) -> {
        // accept strings
    };
}