检查对象的结果是否不为 null 然后转换为布尔值并设置为 Java 的简短版本

Short version of check if the result of an object in not null then cast to boolean and set in Java

我一直在 Java 中寻找以下语句的简短版本:

if(headers.get(BinderHeaders.NATIVE_HEADERS_PRESENT) !=null ) {
      record
          .setNativeHeadersPresent((boolean) headers.get(BinderHeaders.NATIVE_HEADERS_PRESENT));
    }

如果我想使用 Optional.ofNullable 它不起作用,因为我也需要将对象转换为布尔值。

P.S:我正在使用 Java8.

It's not what Optional.ofNullable for,但我会分享它是如何完成的,因为我喜欢方法引用。

Optional.ofNullable(headers.get(BinderHeaders.NATIVE_HEADERS_PRESENT))
        .map(boolean.class::cast)
        .ifPresent(record::setNativeHeadersPresent);

既然你有 Map<String, String>Map#getOrDefault 可能是一个选项。

record.setNativeHeadersPresent(
    Boolean.parseBoolean(
        headers.getOrDefault(BinderHeaders.NATIVE_HEADERS_PRESENT, "false")
    )
);

如果我理解正确,对 ifPresent 的简单调用应该有效:

Optional.ofNullable(headers.get(BinderHeaders.NATIVE_HEADERS_PRESENT))
    .ifPresent(
        x -> record.setNativeHeadersPresent((boolean)x)
    )

使用可选参数做什么并不重要(无论是否强制转换),因为 ifPresent 接受 "function" 作为其参数。您可以传入任何您喜欢的代码。

您似乎正在尝试实现此映射

Input  ->  Output
-----      ------
true       true
false      false
null       false

如果您必须使用 Optional,最简洁的表达方式是

Optional.ofNullable(headers.get(BinderHeaders.NATIVE_HEADERS_PRESENT)).orElse(false);

但是,您根本不需要 Optional。以下将满足您的要求:

Boolean nhp = headers.get(BinderHeaders.NATIVE_HEADERS_PRESENT);
record.setNativeHeadersPresent((nhp == null) ? false : nhp);

如果你想在一个语句中使用它(以调用 headers.get() 两次为代价):

record.setNativeHeadersPresent(
    (headers.get(BinderHeaders.NATIVE_HEADERS_PRESENT) == null) 
        ? false 
        : headers.get(BinderHeaders.NATIVE_HEADERS_PRESENT));

重要提示:使用Map#getOrDefault(...,false)可能无效。如果 Map 实现支持 null 值,那么 getOrDefault() 仍然可以 return null 如果 null 值与该键关联。 (即在某些时候 put(key,value)value==null 被执行)。 default 值仅在映射中不存在键时才 returned。