优秀是一种习惯!!!

工具类使用问题汇总

2023-11-29

工具类使用问题

一、Optional.ofNullable如果值为空集合[],则Optional.ofNullable(value).isPresent()返回true

是的,如果将一个空集合 [] 作为参数传递给 Optional.ofNullable() 方法进行包装,则会返回一个包含空集合的 Optional 对象,而不是一个空的 Optional 对象。

这是由于在 Java 中,空集合 [] 并不等同于 null 值,而是一个长度为 0 的数组。因此,当将空集合 [] 传递给 Optional.ofNullable() 方法时,该方法会将其视为一个非空值,并返回一个包含该空集合的 Optional 对象。

下面是一个示例代码,展示了如何使用 Optional.ofNullable() 对空集合进行包装:

java
List<String> list = new ArrayList<>();
Optional<List<String>> optional1 = Optional.ofNullable(list);  // 包装空集合
System.out.println(optional1.isPresent());  // true
System.out.println(optional1.get().size());  // 0

Optional<List<String>> optional2 = Optional.ofNullable(null);  // 包装空值
System.out.println(optional2.isPresent());  // false

在上面的代码中,我们首先使用 Optional.ofNullable() 方法来包装一个空集合和一个空值。对于空集合,该方法会返回一个包含该集合的 Optional 对象;对于空值,该方法会返回一个空的 Optional 对象。

需要注意的是,即使使用 Optional.ofNullable() 方法包装一个空集合,通过 Optional.isPresent() 方法仍然可以检查该集合是否为空。但要使用 Optional.get() 方法获取该集合时,需要确保该集合存在,否则会抛出 NoSuchElementException 异常。因此,在使用 Optional 进行处理时,需要仔细考虑包装的对象类型及其可能存在的情况。

二、Optional.ofNullable(list).isPresent()这种写法有什么风险?如何改进?

① 这种写法在某些情况下可能会引起NullPointerException异常。因为 Optional.ofNullable(list) 可能会返回一个空的Optional对象,当我们在空的Optional对象上调用其isPresent()方法时,就会抛出NullPointerException异常。

为了改进这种写法,我们可以使用更严谨的写法,如下所示:

if (list != null && !list.isEmpty()) {
// do something
}

或者使用Java 8中的流式API简化代码:

list.stream().findAny().ifPresent(element -> {
// do something
});

这种写法不仅可以避免空指针异常,还可以使代码更加清晰和简洁。

②这种写法使用了Java 8的Optional类,其作用是将一个可能为null的对象进行包装,避免NullPointerException异常的出现。使用isPresent()方法可以判断Optional对象中是否存在非空值。

然而,对于传入的list对象,如果它本身不为null但是其中包含了null元素,那么调用Optional.ofNullable(list)仍然会得到一个非空的Optional对象,从而在使用过程中可能导致NullPointerException异常的发生。

为了改进这种写法,我们可以引入Stream流,在判断list是否为空后,通过filter()方法将其中的null元素过滤掉,再使用findFirst()或findAny()方法转化为Optional对象,这样就可以更加严谨地判断list中是否存在非空元素。代码示例如下:


Optional<Object> optional = Optional.ofNullable(list)
.map(Collection::stream)
.orElseGet(Stream::empty)
.filter(Objects::nonNull)
.findFirst();

三、对象实体如何转换为Map<String, Object>?

你可以使用 Jackson 库将对象实体转换为 Map<String, Object>。Jackson 库提供了 ObjectMapper 类,可以很容易地在 Java 对象和 JSON 或 Map 之间进行转换。

以下是一个示例:

ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
// ... 设置用户属性
Map<String, Object> map = objectMapper.convertValue(user, new TypeReference<Map<String, Object>>() {});

在这个示例中,首先创建了一个 ObjectMapper 对象。然后,使用 ObjectMapperconvertValue 方法将用户对象转换为 Map<String, Object>convertValue 方法的第一个参数是要转换的对象,第二个参数是 TypeReference 对象,用于指定转换的目标类型。

需要注意的是,convertValue 方法会将用户对象的所有属性转换为 Map 的键值对。如果用户对象中的某些属性是复杂对象(例如另一个 Java 对象或集合),那么这些属性也会被转换为相应的 Map 或 List。如果你不希望这种行为,你可能需要自定义转换逻辑。


标题:工具类使用问题汇总
作者:amethystfob
地址:https://newmoon.top/articles/2023/11/28/1701163164814.html

欢迎各路大侠指点留痕: