文章目录
- 前面说的话
- 简介
- Optional的使用
- 三个静态方法
- 方法介绍,Optional一般链式调用,方法也比较简单
- 使用案例,自己使用的多,想到就更新
- 代码
前面说的话
在公司写代码的时候,中台的人说我代码写的烂,说我用的if太多了,判空都是if,很不优雅,问我Optional没使用过么?我没说话,我选择在博客上抒发对中台哥们的不满,不过转念一想,确实,java8都出多久了,还不会使用Optional确实是自己的问题,有一说一,使用Optional把一些简单的代码修改一下,确实显得优雅了许多.还有说我那哥们代码写的确实好,因为项目比较复杂是协同开发,一些复杂的地方都是他那边写的,简单的我这边写的,然后看他的代码简直就是一种享受.唉,xdm要努力啦!!!
简介
java.util.Optional java1.8
官方描述:
(这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。)
个人理解:
Optional就是相当于把对象包了一层,将判断空的部分代码给单独抽出来了,主要就是为了避免null引起的部分问题.
Optional的使用
首先看看Optional的方法:
三个静态方法
- Optional.empty()
返回一个空的Optional,用的不多;主要就是为了使Optional只存在有值和无值的情况,不存在包含null的情况,在后面的ofNullable方法中使用; - Optional.of(T value)
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
传入一个非null的value值,返回一个包含value的Option;如果为null会抛出空指针异常;
- Optional.ofNullable(T value)(用的最多)
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
传入一个非null的value值,返回一个包含value的Option;
传入一个value值,返回一个包含value的Option;可以为null,如果为null则返回一个空的Optional,就是Optional.empty(),可以看看源码
方法介绍,Optional一般链式调用,方法也比较简单
- get()
如果该值存在,将该值直接返回,否则抛出一个 NoSuchElementException 异常。 - isPresent()
返回该值是否存在的布尔值,存在true不存在false; - isPresent(Consumer<? super T> consumer)
没有返回值,传入的是一个函数,如果存在执行函数,不存在则不执行 - filter(Predicate<? super T> predicate)
filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。
- map(Function<? super T, ? extends U> mapper)
对该值执行提供的 get方法调用。 - flatMap(Function<? super T, Optional> mapper)
同上,只不过Function返回的时候就是Optional;而map是代码里面帮忙封装了.
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}
- orElse(T other)
如果调用对象包含值,返回该值,否则返回t。 - orElseGet(Supplier<? extends T> other)
如果调用对象包含值,返回该值,否则返回 other 获取的值。 - orElseThrow(Supplier<? extends X> exceptionSupplier)
如果调用对象包含值,返回该值,否则抛出 other 获取的异常。
使用案例,自己使用的多,想到就更新
- 判断对象是否存在,如果存在则执行操作
@Test
public void test1() {
User user = null;
User retUser = new User();
retUser.setName("aaa");
retUser.setAge(33);
Optional.ofNullable(retUser).ifPresent(x->{
System.out.println(x.getName());
System.out.println(x.getAge());
});
}
- 判断对象是否为空,如果为空则返回默认值
@Test
public void test2() {
// User user = new User();
User user = null;
User retUser = new User();
retUser.setName("aaa");
retUser.setAge(33);
User user1 = Optional.ofNullable(user).orElse(retUser);
System.out.println(user1);
}
- 对对象的某一属性获取,如果为空则获取默认的,好比返回用户头像地址,如果没有设置则返回一个默认的头像地址,如果有则添加地址返回;
@Test
public void test3() {
User user = null;
User retUser = new User();
retUser.setName("aaa");
retUser.setAge(33);
String lowerName = Optional.ofNullable(user).map(u -> {
return u.getName();
}).map(name -> {
return name.toLowerCase();
}).orElse("默认的名字");
System.out.println(lowerName);
}
代码
import lombok.Data;
import lombok.ToString;
import org.junit.Test;
import java.util.Optional;
public class OptionalTest {
public static void main(String[] args) {
User user = new User();
user.setName("yida");
user.setAge(18);
Optional<Object> empty = Optional.empty();
Optional<User> user1 = Optional.of(user);
Optional<User> user2 = Optional.ofNullable(user);
}
@Test
public void test1() {
User user = null;
User retUser = new User();
retUser.setName("aaa");
retUser.setAge(33);
Optional.ofNullable(retUser).ifPresent(x->{
System.out.println(x.getName());
System.out.println(x.getAge());
});
}
@Test
public void test2() {
User user = null;
User retUser = new User();
retUser.setName("aaa");
retUser.setAge(33);
User user1 = Optional.ofNullable(user).orElse(retUser);
System.out.println(user1);
}
@Test
public void test3() {
User user = null;
User retUser = new User();
retUser.setName("aaa");
retUser.setAge(33);
String lowerName = Optional.ofNullable(user).map(u -> {
return u.getName();
}).map(name -> {
return name.toLowerCase();
}).orElse("默认的名字");
System.out.println(lowerName);
}
@Data
@ToString
private static class User{
private String name;
private Integer age;
}
}