工具类使用问题汇总
工具类使用问题
一、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
对象。然后,使用ObjectMapper
的convertValue
方法将用户对象转换为Map<String, Object>
。convertValue
方法的第一个参数是要转换的对象,第二个参数是TypeReference
对象,用于指定转换的目标类型。需要注意的是,
convertValue
方法会将用户对象的所有属性转换为 Map 的键值对。如果用户对象中的某些属性是复杂对象(例如另一个 Java 对象或集合),那么这些属性也会被转换为相应的 Map 或 List。如果你不希望这种行为,你可能需要自定义转换逻辑。
标题:工具类使用问题汇总
作者:amethystfob
地址:https://newmoon.top/articles/2023/11/28/1701163164814.html
欢迎各路大侠指点留痕: