java中的Optional(二)

准备student类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    String name;
    Integer age;
}

主要用来进行Optional方法的测试:

package com.to.optional;

import org.junit.jupiter.api.Test;

import java.util.Optional;
/*
* 本类用来测试java新特新Optional:
* empty(),of(),ofNullAble(),ifPresent(),isPresent(),filter(),map(),flatMap(),orElse(),ofElseThrow(),get()
* 如果包装对象为空filter()*/
public class OptionalTest1 {
    /*ifPresent()方法接受一个Consumer对象(消费函数),如果包装对象的值非空,运行Consumer对象的accept()方法。
    * 由于ifPresent()方法内部做了null值检查,调用前无需担心NPE(空值针)问题。*/
    Student student = new Student("小猫",18);
    @Test
    void test1(){
        printName(student);
    }
    public void printName(Student student){
        Optional.ofNullable(student.age).ifPresent(System.out::println);
    }

    /*filter()方法接受参数为Predicate对象,用于对Optional对象进行过滤,如果符合Predicate的条件,
    返回Optional对象本身,否则返回一个空的Optional对象。*/
    @Test
    void test2(){
        filterAge(student);
    }
    public void filterAge(Student student){
        Optional.ofNullable(student).filter((s)->s.age>10).ifPresent(System.out::println);
    }

    /*map()方法的参数为Function(函数式接口)对象,map()方法将Optional中的包装对象用Function函数进行运算,
    并包装成新的Optional对象(包装对象的类型可能改变)。*/
    @Test
    void test3(){
        Integer a = getAge(student).get();
        System.out.println(a);
    }
    public Optional<Integer> getAge(Student student){
         Optional<Integer> integer = Optional.ofNullable(student).map(Student::getAge);
         return integer;
        //先用ofNullable()方法构造一个Optional<Student>对象,然后用map()计算学生的年龄,返回Optional<Integer>对象
        //如果student为null, 返回map()方法返回一个空的Optinal对象)
    }

    /*跟map()方法不同的是,入参Function函数的返回值类型为Optional<U>类型,而不是U类型,这样flatMap()能将一个
    二维的Optional对象映射成一个一维的对象。*/
    /*这样理解,map()和flatMap()唯一的区别就是flatMap()参数的返回值类型必须是Optional类型,但是最终的结果是Optional,
    * 好好理解这句话*/
    @Test
    void test4(){
        Integer integer = getAges(student).get();
        System.out.println(integer);
    }
    public Optional<Integer>  getAges(Student student){
        return Optional.ofNullable(student).flatMap(s->Optional.ofNullable(s.getAge()));
    }

    /*orElse()方法功能比较简单,即如果包装对象值非空,返回包装对象值,否则返回入参other的值(默认值*/
    @Test
    void test5(){
        String name = getName(student);
        System.out.println(name);
        String s = getName(student).toString();
        System.out.println(s);
    }
    public String getName(Student student){
        return Optional.ofNullable(student).map(Student::getName).orElse("张三");
    }

    /*orElseGet()方法与orElse()方法类似,区别在于orElseGet()方法的入参为一个Supplier对象,
    用Supplier对象的get()方法的返回值作为默认值*/
    @Test
    void test6(){
        Student student1 = new Student();
        String name1 = getName1(student1);
        System.out.println(name1);//张三
    }
    public String getName1(Student student){
        return Optional.ofNullable(student).map(Student::getName).orElseGet(()->"张三");
    }
    /*orElseThrow()方法其实与orElseGet()方法非常相似了,入参都是Supplier对象,只不过orElseThrow()的Supplier对象
    必须返回一个Throwable异常,并在orElseThrow()中将异常抛出
    orElseThrow()方法适用于包装对象值为空时需要抛出特定异常的场景。*/
    @Test
    void test7(){
        Student student1 = new Student();
        getName2(student1);
    }
    public String getName2(Student student){
        return Optional.ofNullable(student).map(Student::getName).orElseThrow(()-> new RuntimeException("出现异常"));
    }

     /* T get()
    如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException*/

    @Test
    void test8(){
        Student student = new Student();
        boolean present = Optional.ofNullable(student).isPresent();
        System.out.println(present);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值