java - 创建新对象来替换不可变对象(immutable对象)中的值

标签 java

我有如下不可变对象(immutable对象)。

@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. 
}

填充这些的信息是从休息调用中获取的,工作正常,如下。

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

如果每个 MainDetail 对象的 dataOne 和 dataTwo 值都为 null,我希望将其切换出去。
我不能只使用 set 方法来执行此操作,因为它是不可变的。

我最终采用了以下详细的方式来执行此操作,其中我需要进行多种检查以交换值。
我不能一次只检查一个,然后切换 cos 对象变得不可变。如果此后第二个也为空,则无法添加另一个。

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

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());
}

关于java - 创建新对象来替换不可变对象(immutable对象)中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65928195/

相关文章:

java - Spring Boot 本地化来自 RestController 的每个响应参数

java - 某些服务器生成的事件不会通过 Websockets 传递到生产环境中的客户端

java - 由于 SIGSEGV 导致 JVM 崩溃

Javadoc 和自定义 doclet

java - 持久化文本 validator

java - 如何使用我的 Java/Android 应用程序进行 SSH?

java - 用于压缩文件的 uidevice takescreenshot 选项不起作用

java - 如何让这段代码进入循环,以便每次都询问用户输入,直到结果为 "kill"?

java - 仅当没有整数增量时,actionPerformed 中的 setLocation 才会更改按钮位置

java - 是否可以通过单个产品 ID 获取单个商品 SKU 详细信息? (Android、Iab 助手)