java 空对象代码优化 jdk1.8
程序员文章站
2022-01-05 10:51:13
...
- 空集合 --> CollectionUtils.isEmpty();
- 空对象
- 判断对象是否为空 Objects.isNull(); 在加判断
- 使用Optional优化 --> 它只适用于”是否存在”的场景。
-
只有当考虑对象返回null是合理的情况下,才进行Optional的返回. 集合不建议使用
-
ifPresent() 方法:检查是否有值的另一个选择是 ifPresent() 方法。该方法除了执行检查,还接受一个Consumer(消费者) 参数,如果对象不是空的,就对执行传入的 Lambda 表达式:
-
@Test public void shouldConvertDTO(){ PersonDTO personDTO = new PersonDTO(); Optional.ofNullable(getPerson()).ifPresent(person -> { personDTO.setDtoAge(person.getAge()); personDTO.setDtoName(person.getName()); }); } private Person getPerson(){ return null; } 这个例子中,只有Person对象不为 null 的时候才会执行断言。
-
- 返回默认值 orElse() 和 orElseGet()
-
orElse() 如果有值则返回该值,否则返回传递给它的参数值,如果对象的初始值不是 null,那么默认值会被忽略
-
@Test public void whenEmptyValue_thenReturnDefault() { User user = null; User user2 = new User("1234", "1234"); User result = Optional.ofNullable(user).orElse(user2); assertEquals(user2.getEmail(), result.getEmail()); }
-
-
orElseGet() 其行为略有不同。这个方法会在有值的时候返回值,如果没有值,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果
-
User result = Optional.ofNullable(user).orElseGet( () -> user2);
-
-
相同不同之处:
-
当Optional 为空的时候没有区别,都会执行后面的方法.
-
当Optional 不为空时,orElse()仍会执行后面的方法.orElseGet()则不会
-
-
orElse() 如果有值则返回该值,否则返回传递给它的参数值,如果对象的初始值不是 null,那么默认值会被忽略
-
orElseThrow() 它会在对象为空的时候抛出异常,而不是返回备选的值
-
@Test(expected = IllegalArgumentException.class) public void whenThrowException_thenOk() { User result = Optional.ofNullable(user) .orElseThrow( () -> new IllegalArgumentException()); }
这里,如果 user 值为 null,会抛出 IllegalArgumentException。
这个方法让我们有更丰富的语义,可以决定抛出什么样的异常,而不总是抛出 NullPointerException。
-
-
-
转换值
-
map:
-
@Test public void whenMap_thenOk() { User user = new User("[email protected]", "1234"); String email = Optional.ofNullable(user) .map(u -> u.getEmail()).orElse("[email protected]"); assertEquals(email, user.getEmail()); }
-
-
-
过滤值
-
Optional 类也提供了按条件“过滤”值的方法
-
filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。
-
@Test public void test() { User user = new User("1234", "1234"); Optional<User> result = Optional.ofNullable(user) .filter(u -> u.getEmail() != null && u.getEmail().contains("@")); assertTrue(result.isPresent()); }
-
-
-
使用示例:
-
String isocode = user.getAddress().getCountry().getIsocode().toUpperCase(); 增加if判断null if (user != null) { Address address = user.getAddress(); if (address != null) { Country country = address.getCountry(); if (country != null) { String isocode = country.getIsocode(); if (isocode != null) { isocode = isocode.toUpperCase(); } } } } 优化: @Test public void whenChaining_thenOk() { User user = new User("[email protected]", "1234"); String result = Optional.ofNullable(user) .flatMap(u -> u.getAddress()) .flatMap(a -> a.getCountry()) .map(c -> c.getIsocode()) .orElse("default"); assertEquals(result, "default"); } 方法引用在调整 String result = Optional.ofNullable(user) .flatMap(User::getAddress) .flatMap(Address::getCountry) .map(Country::getIsocode) .orElse("default");
-
推荐阅读
-
如何优化代码运行速度,Java性能调优技巧
-
java实战技巧之if-else代码优化技巧大全
-
《深入理解Java虚拟机》-----第10章 程序编译与代码优化-早期(编译期)优化
-
java实战技巧之if-else代码优化技巧大全
-
Java中Console对象实例代码
-
13_Java面向对象_第13天(static、final、匿名对象、内部类、包、修饰符、代码块)_讲义
-
Java代码质量改进之:同步对象的选择
-
Java 判断实体对象及所有属性是否为空的操作
-
如何使用简单 PHP 对象 POPO (Plain old PHP Object) 来优化你的代码
-
java 对象的初始化流程(静态成员、静态代码块、普通代码块、构造方法)