如果可以在my HashMap中找到对应的键/值对,我想覆盖我的对象status值.

示例模型:

public class Url {
  private String url;
  private String status;
}
private List<Url> overwriteStatus(List<Url> myObjects) {
   final var myChecklist = Map.of("www.foo.com", "blocked");

  //if the key exists in `myChecklist`, then overwrite the status
  myObjects.stream().forEach(item -> Optional.ofNullable(myChecklist.get(item.getUrl())).ifPresent(item::setStatus));

  return myObjects;
}

我目前使用Optional的方法感觉非常混乱.

判断HashMap中是否存在该值的最佳方法是什么,如果存在,请在下一步中使用该值?

推荐答案

Documentation表示Stream API warns't against表示stateful streams的用法.

流中使用的函数必须是pure,即不引起stream elements的Mutations ,不修改对象outside the stream(这是代码中基本上发生的事情).

您的任务可以在不违反上述准则的情况下通过流来完成.为此,如果必须应用新的status,则需要创建new对象,而不是更改状态.

我还建议Url个不可变的对象.因此,相同的实例可以在应用程序的不同部分安全地重用.

private List<Url> overwriteStatus(List<Url> myObjects, 
                                  Map<String, String> myChecklist) {

    return myObjects.stream()
            .map(item -> !myChecklist.containsKey(item.getUrl()) ? item :
                    new Url(item.getUrl(), myChecklist.get(item.getUrl())))
            .collect(Collectors.toList());
}

Immutable Url级(无设置符,所有字段均为private)

public class Url {
    private final String url;
    private final String status;

    // constructor and getters
}

Note:

  • 关于Optional类型,在JDK中引入它只是为了一个特殊目的:表示可能产生null的方法的返回类型,就是这样.按照链接方法的顺序使用Optional的做法被认为是antipattern.

Java相关问答推荐

Jooq隐式地将bigint转换为数字,并且索引不起作用

编译期间错误(Java 0000)Android .Net MAUI

Android视图覆盖不阻止点击它后面的控件

如何在返回bigint []值的子查询中使用any?

只需最少的代码更改即可将版本号标记添加到日志(log)

如何找到MongoDB文档并进行本地化?

为什么Java Annotation接口覆盖对象类中的方法

Java编译器抛出可能未正确初始化的错误?

使用用户引入的参数生成人员数组

在向WebSphere中的文档添加元素时iText挂起

Groovy/Java:匹配带引号的命令选项

AWS Java SDK v2.x中没有setObjectAcl方法

在Java泛型中使用通配符时,如何推断类型

使用MediaPlayer类在一段时间后停止播放音乐

持续时间--为什么在秒为负数的情况下还要做额外的工作?

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

ReturnedRect在升级后反转

为什么Java编译器为没有参数的方法(getter方法)创建桥接方法

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?