Optional源码解析与实践( 四 )

  • }
  • 2)方法说明filter(Predicate p): 如果optional不为空 , 则执行Predicate p , 如果p的结果为true , 则返回原本的optional , 否则返回空的optional
    3)测试代码
    1. public static void main(String[] args) {
    2. Integer value1 = 5;
    3. Integer value2 = 6;
    4. Optional<Integer> optional1 = Optional.ofNullable(value1);
    5. Optional<Integer> optional2 = Optional.of(value2);
    6. Optional<Integer> result =optional1.filter(t->t > 5);
    7. System.out.println("optional1的filter后的值:"+result);
    8. result =optional2.filter(t->t > 5);
    9. System.out.println("optional2的filter后的值:"+result);
    4)运行结果
    Optional源码解析与实践

    文章插图
    2.3.6 映射方法1)源码
    1. public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    2. Objects.requireNonNull(mapper);
    3. if (!isPresent())
    4. return empty();
    5. else {
    6. return Optional.ofNullable(mapper.apply(value));
    7. }
    8. }
    9. public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
    10. Objects.requireNonNull(mapper);
    11. if (!isPresent())
    12. return empty();
    13. else {
    14. return Objects.requireNonNull(mapper.apply(value));
    15. }
    16. }
    2)方法说明
    • map(Function<t, u=""> mapper): 如果存在一个值 , 则对其应用提供的映射函数 , 如果结果非空 , 则返回描述结果的Optional 。否则返回一个空的Optional 。
    • flatMap(Function< T,Optional> mapper): 如果有值 , 则对其应用提供的可选映射函数 , 返回结果 , 否则返回空的可选函数 。这个方法类似于map(Function) , 但是提供的映射器的结果已经是一个可选的 , 如果调用 , flatMap不会用额外的可选的包装它 。
    • 区别:map会自动将u放到optional中 , 而flatMap则需要手动给u创建一个optional
    3)测试代码
    1. public static void main(String[] args) {
    2. User user1 = null;
    3. User user2 = new User("user2名字",19);
    4. Optional<User> optional1 = Optional.ofNullable(user1);
    5. Optional<User> optional2 = Optional.of(user2);
    6. System.out.println("=========map==========");
    7. System.out.println("optional1的map前的值:"+optional1);
    8. Optional<String> result =optional1.map(t->t.getName());
    9. System.out.println("optional1的map后的值:"+result);
    10. System.out.println("optional2的map前的值:"+optional2);
    11. result =optional2.map(t->t.getName());
    12. System.out.println("optional2的map后的值:"+result);
    13. System.out.println("===========flatMap========");
    14. System.out.println("optional1的flatMap前的值:"+optional1);
    15. Optional<Integer> result2 =optional1.flatMap(t->Optional.ofNullable(t.getAge()));
    16. System.out.println("optional1的flatMap后的值:"+result2);
    17. 经验总结扩展阅读