繁体   English   中英

创建新的 Object 以替换不可变 Object 中的值

[英]Create new Object to replace values in an immutable Object

我有如下不可变对象。

@Getter 
@Builder 
class MainDetail {
    // 5 other String fields
    private Data data;
}

@Getter 
@Builder 
class ImageUrl {
    private final String dataOne; // looking to change these 2 values
    private final String dataTwo; // if rest call returns null for these. 
}

填写这些信息的信息来自 rest 调用,工作正常如下。

List<MainDetail> featureBenefits = // value from a rest response 

如果每个 MainDetail Object 的值是 null,我希望在这里切换 dataOne 和 dataTwo 值。
我不能只使用 set 方法来执行此操作,因为它是不可变的。

我最终得到了以下详细的方法,我需要对检查进行多种变体以交换值。
我不能一次只检查一个并切换,因为 Object 变得不可变。 如果第二个也是 null 之后,则无法添加另一个。

有没有办法更优雅地做到这一点,可能通过流? 感谢任何帮助。 谢谢。

List<MainDetail> mainDetails = new ArrayList<>();
for (MainDetail mainDetail : featureBenefits) {
    if (mainDetail.getImageUrl().getDataOne() == null && mainDetail.getImageUrl().getdataTwo() == null) {
        ImageUrl imageUrl = ImageUrl.builder()
                .dataOne("default1")
                .dataTwo("default12")
                .build();
        MainDetail detail = MainDetail.builder()
                .imageUrl(imageUrl)
                .build();
        mainDetails.add(detail);
    }
    else if (mainDetail.getImageUrl().getdataOne() == null) {
        ImageUrl imageUrl = ImageUrl.builder()
                .dataOne("default1")
                .build();
        MainDetail detail = MainDetail.builder()
                .imageUrl(imageUrl)
                .build();
        mainDetails.add(detail);
    }
    else if (mainDetail.getImageUrl().getDataTwo() == null) {
        ImageUrl imageUrl = ImageUrl.builder()
                .dataTwo("default2")
                .build();
        MainDetail detail = MainDetail.builder()
                .imageUrl(imageUrl)
                .build();
        mainDetails.add(detail);
    }
}

这个如何:

List<MainDetail> featureBenefits = Collections.emptyList();
List<MainDetail> mainDetails = new ArrayList<>();

for (MainDetail mainDetail : featureBenefits) {
    ImageUrl imageUrl = mainDetail.getImageUrl();

    mainDetails.add(MainDetail.builder()
                              .imageUrl(ImageUrl.builder()
                                                .dataOne(Optional.ofNullable(imageUrl.getDataOne()).orElse("default1"))
                                                .dataTwo(Optional.ofNullable(imageUrl.getDataTwo()).orElse("default2"))
                                                .build())
                              .build());
}

如果您不限于坚持使用标准构建器,那么您可以添加自己的方法来提供默认值:

class ImageUrl {
    private final String dataOne; // looking to change these 2 values
    private final String dataTwo; // if rest call returns null for these. 

    public ImageUrl withDefaultDataOne(String value) {
        return dataOne == null ? new ImageUrl(value, dataTwo) : this;
    }
            
    public ImageUrl withDefaultDataTwo(String value) {
        return dataTwo == null ? new ImageUrl(dataOne, value) : this;
    }
}

然后你的翻译代码变成:

for (MainDetail mainDetail : featureBenefits) {
    ImageUrl imageUrl = mainDetail.getImageUrl()
        .withDefaultDataOne("default1")
        .withDefaultDataTwo("default2");
    mainDetails.add(MainDetail.builder().imageUrl(imageUrl).build());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM