有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想重构我的代码(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);
        };
    }
}

编译失败,因为它无法解析“使用”和“源”


共 (2) 个答案

  1. # 1 楼答案

    在这里:

    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个警告”,那么这就是你可以做的。另一方面触摸代码时;正如所说的:不要盲目地去做。也许你可以退一步;甚至在这里进行更好的重构

    (我并不是说这在这里是可能的;我只是指出:当您接触代码时,请确保您将提交的更改对您真正有意义)

  2. # 2 楼答案

    如果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
        };
    }