• 十六章:Java8的其它新特性


    目录

    16.1:Lambda表达式

    16.2:函数式(Function)接口

    16.3:方法引用和构造器引用

    16.4:强大的Stream API

                    ①Stream实例化

                    ②Stream的中间操作

                    ③终止操作

    16.5:Option类


    16.1:Lambda表达式

    1. package com.jiayifeng.java;
    2. import org.junit.Test;
    3. import java.util.Comparator;
    4. import java.util.function.Consumer;
    5. /**
    6. * author 爱编程的小贾
    7. * create 2023-10-19 12:29
    8. *
    9. * 一:Lambda表达式的使用
    10. * 1.举例:(o1,o2) -> Integer.compare(o1,o2);
    11. * 2.格式:
    12. * "->":Lambda操作符或箭头操作符
    13. * "->"左边:Lambda形参列表(也就是接口中的抽象方法的形参列表)
    14. * "->"左边:Lambda体(也就是重写的抽象方法的方法体)
    15. *
    16. * 3.Lambda表达式的使用:(六种情况)
    17. *
    18. * 4.Lambda表达式的本质:作为函数式接口的实例
    19. * 如果一个接口中只声明了一个抽象方法,则此接口就称之为函数式接口。
    20. * 我们可以在一个接口上使用@FunctionalInterface注解,这样可以检验它
    21. * 是否是一个函数式接口
    22. *
    23. *
    24. * 5.总结
    25. * "->"左边:Lambda形参列表的参数类型可以省略(类型推断);
    26. * 如果Lambda形参列表只有一个参数,其一对()也可以省略
    27. * "->"右边:Lambda体应使用一对{}包裹;
    28. * 如果Lambda体只有一条执行语句(也可能是return语句),可以省略这一对{}和return关键字
    29. *
    30. */
    31. public class Lambda {
    32. @Test
    33. public void test1(){
    34. Runnable r1 = new Runnable(){
    35. @Override
    36. public void run() {
    37. System.out.println("我爱北京天安门!");
    38. }
    39. };
    40. r1.run();
    41. System.out.println("************");
    42. // Lambda表达式的写法
    43. Runnable r2 = () -> System.out.println("我爱北京故宫!");
    44. r2.run();
    45. System.out.println("************");
    46. // 方法引用
    47. Comparator com3 = Integer::compare;
    48. int compare = com3.compare(32, 21);
    49. System.out.println(compare);
    50. }
    51. // 语法格式一:无参、无返回值
    52. @Test
    53. public void test2(){
    54. Runnable r1 = new Runnable(){
    55. @Override
    56. public void run() {
    57. System.out.println("我爱北京天安门!");
    58. }
    59. };
    60. r1.run();
    61. System.out.println("************");
    62. // Lambda表达式的写法
    63. Runnable r2 = () -> {
    64. System.out.println("我爱北京故宫!");
    65. };
    66. r2.run();
    67. }
    68. // 语法格式二:Lambda需要一个参数,但是没有返回值
    69. @Test
    70. public void test3(){
    71. Consumer con = new Consumer() {
    72. @Override
    73. public void accept(String s) {
    74. System.out.println(s);
    75. }
    76. };
    77. con.accept("谎言和誓言的区别是什么?");
    78. System.out.println("**************");
    79. Consumer con1 = (String s) -> {
    80. System.out.println(s);
    81. };
    82. con1.accept("一个是听的人当真了,一个是说的人当真了");
    83. }
    84. // 语法格式三:数据类型可以省略,因为可由编译推断得出,称为“类型推断”
    85. @Test
    86. public void test4(){
    87. Consumer con1 = (String s) -> {
    88. System.out.println(s);
    89. };
    90. con1.accept("一个是听的人当真了,一个是说的人当真了");
    91. System.out.println("******************");
    92. Consumer con2 = (s) -> {
    93. System.out.println(s);
    94. };
    95. con1.accept("一个是听的人当真了,一个是说的人当真了!");
    96. }
    97. // 语法格式四:Lambda若只需要一个参数时,参数的小括号可以省略
    98. @Test
    99. public void test5(){
    100. Consumer con1 = s -> {
    101. System.out.println(s);
    102. };
    103. con1.accept("一个是听的人当真了,一个是说的人当真了");
    104. }
    105. // 语法格式五:Lambda需要两个或两个以上的参数,多条执行语句,并且可以有返回值
    106. @Test
    107. public void test6() {
    108. Comparator com1 = new Comparator() {
    109. @Override
    110. public int compare(Integer o1, Integer o2) {
    111. System.out.println(o1);
    112. System.out.println(o2);
    113. return o1.compareTo(o2);
    114. }
    115. };
    116. System.out.println(com1.compare(12,21));
    117. System.out.println("**************");
    118. Comparator com2 = (o1, o2) -> {
    119. System.out.println(o1);
    120. System.out.println(o2);
    121. return o1.compareTo(o2);
    122. };
    123. System.out.println(com2.compare(12,6));
    124. }
    125. // 语法格式六:当Lambda体只有一条语句时,return与大括号若有,都可以省略
    126. @Test
    127. public void test7(){
    128. Comparator com1 = (o1, o2) -> {
    129. return o1.compareTo(o2);
    130. };
    131. System.out.println(com1.compare(12,6));
    132. System.out.println("***********");
    133. Comparator com2 = (o1, o2) -> o1.compareTo(o2);
    134. System.out.println(com1.compare(12,9));
    135. }
    136. }

    16.2:函数式(Function)接口

    Java内置四大核心函数式接口
    函数式接口参数类型返回类型用途
    Consumer消费型接口Tvoid对类型为T的对象应用操作,包含方法:void accept(T t)
    Supplier供给型接口T返回类型为T的对象,包含方法:T get()
    Function函数型接口TR对类型为T的对象应用操作,并返回结果,结果是R类型的对象。包含方法:R apply(T t)
    Predicate断定型接口Tboolean确定类型为T的对象是否满足某约束,并返回boolean值。包含方法:boolean test(T t)
    1. package com.jiayifeng.java;
    2. import org.junit.Test;
    3. import java.util.function.Consumer;
    4. /**
    5. * author 爱编程的小贾
    6. * create 2023-10-19 16:51
    7. *
    8. * 一:Java内置的四大核心函数式接口
    9. */
    10. public class LambdaTest1 {
    11. @Test
    12. public void test1(){
    13. happyTime(500, new Consumer() {
    14. @Override
    15. public void accept(Double aDouble) {
    16. System.out.println("学习太累了,去超市买瓶水,价格为:" + aDouble);
    17. }
    18. });
    19. System.out.println("**************");
    20. happyTime(400,money -> System.out.println("学习太累了,去超市喝了瓶水,价格为:" + money));
    21. }
    22. public void happyTime(double money, Consumer con){
    23. con.accept(money);
    24. }
    25. }

    16.3:方法引用和构造器引用

    1. package com.jiayifeng.java;
    2. import org.junit.Test;
    3. import java.io.PrintStream;
    4. import java.util.function.Consumer;
    5. /**
    6. * author 爱编程的小贾
    7. * create 2023-10-19 17:10
    8. *
    9. * 一:方法引用和构造器引用
    10. * 1.使用情景:当要传递给Lambda体的操作已经有实现的方法了,可以使用方法引用
    11. * 2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例。
    12. * 所以方法引用,也是函数式接口的实例
    13. * 3.使用格式:类(或对象) :: 方法名
    14. * 4.具体分为如下的三种情况:
    15. * 对象 :: 非静态方法
    16. * 类 :: 静态方法
    17. * 类 :: 非静态方法
    18. * 5.方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与
    19. * 方法引用的方法的形参列表和返回值类型相同(针对于前两种情况)
    20. */
    21. public class MethodRefTest {
    22. @Test
    23. public void test1(){
    24. // 情况一:对象 :: 实例方法
    25. // Consumer中的void accept(T t)
    26. // PrintStream中的void Println(T t)
    27. Consumer con1 = str -> System.out.println(str);
    28. con1.accept("北京");
    29. System.out.println("**********");
    30. PrintStream ps = System.out;
    31. Consumer con2 = ps :: println;
    32. con2.accept("beijing");
    33. }
    34. }

    构造器引用:

            和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致

    数组引用:

            可以将数组看做是一个特殊的类,写法与构造器引用一致

    16.4:强大的Stream API

            使用Stream API对数据集合进行操作,就类似于使用SQL执行的数据库查询

            简言之:Stream API提供了一种高效且易于使用的处理数据的方式

            定义:Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列

                    “集合讲的是数据,Stream讲的是计算”

            注意:

                    ①Stream自己不会存储数据

                    ②Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream

                    ③Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行

            执行流程:

                    ①Stream实例化
    1. package com.jiayifeng.java;
    2. /**
    3. * author 爱编程的小贾
    4. * create 2023-10-19 19:34
    5. */
    6. public class Employee {
    7. private int id;
    8. private String name;
    9. private int age;
    10. private double salary;
    11. public Employee(int id) {
    12. this.id = id;
    13. }
    14. public Employee(int id, String name, int age) {
    15. this.id = id;
    16. this.name = name;
    17. this.age = age;
    18. }
    19. public Employee(int id, String name) {
    20. this.id = id;
    21. this.name = name;
    22. }
    23. @Override
    24. public boolean equals(Object o) {
    25. if (this == o) return true;
    26. if (!(o instanceof Employee)) return false;
    27. Employee employee = (Employee) o;
    28. if (getId() != employee.getId()) return false;
    29. if (getAge() != employee.getAge()) return false;
    30. if (Double.compare(employee.getSalary(), getSalary()) != 0) return false;
    31. return getName() != null ? getName().equals(employee.getName()) : employee.getName() == null;
    32. }
    33. @Override
    34. public int hashCode() {
    35. int result;
    36. long temp;
    37. result = getId();
    38. result = 31 * result + (getName() != null ? getName().hashCode() : 0);
    39. result = 31 * result + getAge();
    40. temp = Double.doubleToLongBits(getSalary());
    41. result = 31 * result + (int) (temp ^ (temp >>> 32));
    42. return result;
    43. }
    44. @Override
    45. public String toString() {
    46. return "Employee{" +
    47. "id=" + id +
    48. ", name='" + name + '\'' +
    49. ", age=" + age +
    50. ", salary=" + salary +
    51. '}';
    52. }
    53. public int getId() {
    54. return id;
    55. }
    56. public void setId(int id) {
    57. this.id = id;
    58. }
    59. public String getName() {
    60. return name;
    61. }
    62. public void setName(String name) {
    63. this.name = name;
    64. }
    65. public int getAge() {
    66. return age;
    67. }
    68. public void setAge(int age) {
    69. this.age = age;
    70. }
    71. public double getSalary() {
    72. return salary;
    73. }
    74. public void setSalary(double salary) {
    75. this.salary = salary;
    76. }
    77. public Employee() {
    78. }
    79. public Employee(int id, String name, int age, double salary) {
    80. this.id = id;
    81. this.name = name;
    82. this.age = age;
    83. this.salary = salary;
    84. }
    85. }
    1. package com.jiayifeng.java;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. * author 爱编程的小贾
    6. * create 2023-10-19 19:35
    7. */
    8. public class EmployeeData {
    9. public static List getEmp() {
    10. List list = new ArrayList<>();
    11. list.add(new Employee(1001, "马化腾", 34, 6000.38));
    12. list.add(new Employee(1002, "马云", 12, 9876.12));
    13. list.add(new Employee(1003, "刘强东", 33, 3000.82));
    14. list.add(new Employee(1004, "雷军", 26, 7657.37));
    15. list.add(new Employee(1005, "李彦宏", 65, 5555.21));
    16. list.add(new Employee(1006, "比尔盖茨", 42, 9500.43));
    17. list.add(new Employee(1006, "任正非", 26, 4333.32));
    18. list.add(new Employee(1006, "扎克伯格", 35, 2500.32));
    19. return list;
    20. }
    21. }
    1. package com.jiayifeng.java;
    2. import org.junit.Test;
    3. import java.util.Arrays;
    4. import java.util.List;
    5. import java.util.stream.IntStream;
    6. import java.util.stream.Stream;
    7. /**
    8. * author 爱编程的小贾
    9. * create 2023-10-19 19:26
    10. *
    11. * 一:Stream API
    12. * 1.Stream关注的是对数据的运算,与CPU打交道
    13. * 集合关注的是数据的存储,与内存打交道
    14. *
    15. * 2.Stream执行流程
    16. * ①Stream实例化
    17. * ②一系列的中间操作(过滤、映射等)
    18. * ③终止操作
    19. *
    20. * 3.说明
    21. * ①一个中间操作链,对数据源的数据进行处理
    22. * ②一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被调用
    23. *
    24. */
    25. public class StreamAPI {
    26. /**
    27. * 创建Stream方式1:通过集合List
    28. */
    29. @Test
    30. public void test1() {
    31. List emp = EmployeeData.getEmp();
    32. //通过集合来创建
    33. //顺序流
    34. Stream stream = emp.stream();
    35. //并行流
    36. Stream employeeStream = emp.parallelStream();
    37. }
    38. /**
    39. * 创建Stream方式2:通过数组
    40. */
    41. @Test
    42. public void test2() {
    43. int arr[] = new int[]{1, 2, 3, 4, 5, 6};
    44. //调用Arrays.stream返回数组
    45. IntStream stream = Arrays.stream(arr);
    46. Employee e1 = new Employee(1, "1", 1, 1);
    47. Employee e2 = new Employee(2, "1", 1, 1);
    48. Employee employees[] = new Employee[]{e1, e2};
    49. Stream stream1 = Arrays.stream(employees);
    50. }
    51. /**
    52. * 创建Stream方式3: 通过Stream的of()来创建
    53. */
    54. @Test
    55. public void test3() {
    56. Stream integerStream = Stream.of(1, 2, 3, 4, 5, 6);
    57. Streamextends Number> stream = Stream.of(1.0, 2, 3, 4, 5, 6);
    58. }
    59. /**
    60. * 创建Stream方式4:创建无限流
    61. */
    62. @Test
    63. public void test4() {
    64. //迭代
    65. //遍历前10个偶数
    66. Stream.iterate(0, t -> t + 2).limit(10).forEach(System.out::println);
    67. //生成
    68. Stream.generate(Math::random).limit(10).forEach(System.out::println);
    69. }
    70. }
                    ②Stream的中间操作
    1. package com.jiayifeng.java;
    2. import org.junit.Test;
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.List;
    6. import java.util.stream.Stream;
    7. /**
    8. * author 爱编程的小贾
    9. * create 2023-10-19 19:46
    10. *
    11. * 一:测试Stream的中间操作
    12. */
    13. public class StreamAPITest1 {
    14. // 1.筛选与切片
    15. @Test
    16. public void test1(){
    17. List list = EmployeeData.getEmp();
    18. // filter(Predicate p):接收Lambda,从流中欧排除某些元素
    19. Stream stream = list.stream();
    20. // 查询员工表中薪资大于7000的员工信息
    21. stream.filter(e -> e.getSalary() > 7000).forEach(System.out :: println);
    22. System.out.println();
    23. // limit(n):截断流,使其元素不超过给定数量
    24. list.stream().limit(3).forEach(System.out :: println);
    25. System.out.println();
    26. // skip(n):跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流
    27. list.stream().skip(3).forEach(System.out :: println);
    28. System.out.println();
    29. // distinct():筛选,通过流所生成元素的hashCode()和equals()去除重复元素
    30. list.add(new Employee(1010,"刘强东",40,8000));
    31. list.add(new Employee(1010,"刘强东",40,8000));
    32. list.add(new Employee(1010,"刘强东",40,8000));
    33. list.add(new Employee(1010,"刘强东",40,8000));
    34. list.add(new Employee(1010,"刘强东",40,8000));
    35. // System.out.println(list);
    36. list.stream().distinct().forEach(System.out :: println);
    37. }
    38. // 2.映射
    39. @Test
    40. public void test2(){
    41. // map(Function f):接受一个函数作为参数,将元素转换成其它形式或提取信息,该函数会
    42. // 被应用到每一个元素上,并将其映射成一个新的元素
    43. List list = Arrays.asList("aa","bb","cc","dd");
    44. list.stream().map(str -> str.toUpperCase()).forEach(System.out :: println);
    45. // flatMap(Function f):接收一个函数作为参数,将流中的每一个值都换成另一个流,然后把所有
    46. // 流连接成一个流
    47. ArrayList list1 = new ArrayList<>();
    48. list1.add(1);
    49. list1.add(2);
    50. list1.add(3);
    51. ArrayList list2 = new ArrayList();
    52. list2.add(4);
    53. list2.add(5);
    54. list2.add(6);
    55. list1.addAll(list2);
    56. System.out.println(list1);
    57. }
    58. // 3.排序
    59. @Test
    60. public void test3(){
    61. // sort():自然排序
    62. List list = Arrays.asList(12, 45, 24, 46, 67, 98);
    63. list.stream().sorted().forEach(System.out :: println);
    64. // 抛异常,原因:Employee没有实现Comparable接口
    65. // List emp = EmployeeData.getEmp();
    66. // emp.stream().sorted().forEach(System.out :: println);
    67. // sorted(Compatater com):定制排序
    68. List emp = EmployeeData.getEmp();
    69. emp.stream().sorted((e1,e2) -> Integer.compare(e1.getAge(),e2.getAge()))
    70. .forEach(System.out :: println);
    71. }
    72. }
                    ③终止操作
    1. package com.jiayifeng.java1;
    2. /**
    3. * author 爱编程的小贾
    4. * create 2023-10-21 11:49
    5. */
    6. public class Student {
    7. private int id;//id
    8. private String name;//姓名
    9. private int age;//年龄
    10. private Score score;//成绩(优秀、良好、及格)
    11. public int getId() {
    12. return id;
    13. }
    14. public void setId(int id) {
    15. this.id = id;
    16. }
    17. public String getName() {
    18. return name;
    19. }
    20. public void setName(String name) {
    21. this.name = name;
    22. }
    23. public int getAge() {
    24. return age;
    25. }
    26. public void setAge(int age) {
    27. this.age = age;
    28. }
    29. public Score getScore() {
    30. return score;
    31. }
    32. public void setScore(Score score) {
    33. this.score = score;
    34. }
    35. public enum Score{
    36. EXCELLENT,
    37. GOOD,
    38. PASS
    39. }
    40. public Student(int id, String name, int age, Score score) {
    41. this.id = id;
    42. this.name = name;
    43. this.age = age;
    44. this.score = score;
    45. }
    46. }
    1. package com.jiayifeng.java1;
    2. /**
    3. * author 爱编程的小贾
    4. * create 2023-10-21 11:50
    5. */
    6. import com.jiayifeng.java.Employee;
    7. import com.jiayifeng.java.EmployeeData;
    8. import org.junit.Test;
    9. import java.util.Arrays;
    10. import java.util.List;
    11. import java.util.Optional;
    12. import java.util.stream.Collectors;
    13. import java.util.stream.Stream;
    14. /**
    15. * @description: 终止操作
    16. * allMatch——检查是否匹配所有元素
    17. * anyMatch——检查是否至少匹配一个元素
    18. * noneMatch——检查是否没有匹配的元素
    19. * findFirst——返回第一个元素
    20. * findAny——返回当前流中的任意元素
    21. * count——返回流中元素的总个数
    22. * max——返回流中最大值
    23. * min——返回流中最小值
    24. * @author: xz
    25. */
    26. public class StreamTest {
    27. public static void main(String[] args) {
    28. List studentsList = Arrays.asList(
    29. new Student(1, "李四", 20,Student.Score.EXCELLENT),
    30. new Student(2, "张三", 19,Student.Score.GOOD ),
    31. new Student(3, "王五", 24,Student.Score.PASS),
    32. new Student(4, "赵六", 23, Student.Score.GOOD),
    33. new Student(5, "xz", 21, Student.Score.PASS )
    34. );
    35. //检查学生的成绩是都是良好
    36. boolean b = studentsList.stream()
    37. .allMatch(s -> s.getScore().equals(Student.Score.GOOD));
    38. System.out.println("allMatch——"+b);
    39. //检查学生的成绩至少有一个是良好
    40. boolean b1 = studentsList.stream()
    41. .anyMatch(s -> s.getScore().equals(Student.Score.GOOD));
    42. System.out.println("anyMatch——"+b1);
    43. //检查学生的成绩是否没有匹配到良好
    44. boolean b2 = studentsList.stream()
    45. .noneMatch(s -> s.getScore().equals(Student.Score.GOOD));
    46. System.out.println("noneMatch——"+b2);
    47. //按年龄排序且返回第一个元素
    48. Optional op1 = studentsList.stream()
    49. .sorted((s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()))
    50. .findFirst();
    51. System.out.println("findFirst(按年龄排序且返回第一个元素)——"+op1.get());
    52. //查找学生成绩为及格且返回的任意元素
    53. Optional op2 = studentsList.parallelStream()
    54. .filter(s -> s.getScore().equals(Student.Score.PASS))
    55. .findAny();
    56. System.out.println("findAny(查找学生成绩为及格且返回的任意元素)——"+op2.get());
    57. ///查找学生的总人数
    58. long count = studentsList.stream()
    59. .count();
    60. System.out.println("count——"+count);
    61. //查找年龄最大的学生信息
    62. Optional op3 = studentsList.stream()
    63. .max((s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()));
    64. System.out.println("max——"+op3.get());
    65. //查找学生所有的年龄范围,并获取最小的年龄
    66. Optional op4 = studentsList.stream()
    67. .map(Student::getAge)
    68. .min(Integer::compare);
    69. System.out.println("min——"+op4.get());
    70. }
    71. /*
    72. allMatch——false
    73. anyMatch——true
    74. noneMatch——false
    75. findFirst(按年龄排序且返回第一个元素)——com.jiayifeng.java1.Student@5f184fc6
    76. findAny(查找学生成绩为及格且返回的任意元素)——com.jiayifeng.java1.Student@34a245ab
    77. count——5
    78. max——com.jiayifeng.java1.Student@34a245ab
    79. min——19
    80. */
    81. // 规约
    82. @Test
    83. public void Test1(){
    84. // 练习一:计算1-10的自然数之和
    85. List list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    86. Integer sum = list.stream().reduce(0,Integer::sum);
    87. System.out.println(sum);//55
    88. // 练习二:计算公司所有员工工资的总和
    89. List employees = EmployeeData.getEmp();
    90. Stream salaryStream = employees.stream().map(Employee::getSalary);
    91. Optional sumMoney = salaryStream.reduce((d1, d2) -> (d1 + d2));
    92. System.out.println(sumMoney);
    93. }
    94. // 收集
    95. @Test
    96. public void test2(){
    97. List emp = EmployeeData.getEmp();
    98. List employeeList = emp.stream().filter(e -> e.getSalary() > 6000).collect(Collectors.toList());
    99. employeeList.forEach(System.out::println);
    100. }
    101. }

    Stream的详细介绍参考:http://t.csdnimg.cn/bAycz

    16.5:Optional类

            为了解决空指针异常而引入Optional类

            Optional类的javadoc描述如下:这是一个可以为null的容器对象。如果值存在,则isPresent()方法会返回true,调用get()方法会返回该对象

            

    1. package com.jiayifeng.java2;
    2. /**
    3. * author 爱编程的小贾
    4. * create 2023-10-21 12:25
    5. */
    6. public class Girl {
    7. private String name;
    8. public String getName() {
    9. return name;
    10. }
    11. public void setName(String name) {
    12. this.name = name;
    13. }
    14. public Girl() {
    15. }
    16. @Override
    17. public String toString() {
    18. return "Girl{" +
    19. "name='" + name + '\'' +
    20. '}';
    21. }
    22. public Girl(String name) {
    23. this.name = name;
    24. }
    25. }
    1. package com.jiayifeng.java2;
    2. /**
    3. * author 爱编程的小贾
    4. * create 2023-10-21 12:25
    5. */
    6. public class Boy {
    7. private Girl girl;
    8. public Boy(Girl girl) {
    9. this.girl = girl;
    10. }
    11. public Boy() {
    12. }
    13. @Override
    14. public String toString() {
    15. return "Boy{" +
    16. "girl=" + girl +
    17. '}';
    18. }
    19. public Girl getGirl() {
    20. return girl;
    21. }
    22. public void setGirl(Girl girl) {
    23. this.girl = girl;
    24. }
    25. }
    1. package com.jiayifeng.java2;
    2. import org.junit.Test;
    3. import java.util.Optional;
    4. /**
    5. * author 爱编程的小贾
    6. * create 2023-10-21 12:27
    7. *
    8. * 一:Optional类:为了在程序中避免出现空指针异常而创建的
    9. */
    10. public class OptionalTest {
    11. @Test
    12. public void test1(){
    13. // 1.Optional.of(T t):创建一个Optional实例,t必须为空
    14. Girl girl = new Girl();
    15. Optional girl1 = Optional.of(girl);
    16. // 2.Optional.empty():创建一个空的Optional实例
    17. // 3.Optional.ofNullable(T t):t可以为空
    18. Girl girl2 = new Girl();
    19. girl2 = null;
    20. Optional optionalGirlgirl1 = Optional.ofNullable(girl2);
    21. System.out.println(optionalGirlgirl1);
    22. }
    23. public String getGirlName(Boy boy){
    24. Optional boyOptional = Optional.ofNullable(boy);
    25. // 此时的boy1一定非空
    26. Boy boy1 = boyOptional.orElse(new Boy(new Girl("迪丽热巴")));
    27. Girl girl1 = boy1.getGirl();
    28. Optional girlOptional = Optional.ofNullable(girl1);
    29. // girl2一定非空
    30. Girl girl2 = girlOptional.orElse(new Girl("古力娜扎"));
    31. return girl2.getName();
    32. }
    33. @Test
    34. public void test2(){
    35. Boy boy = null;
    36. boy = new Boy();
    37. boy = new Boy(new Girl("贾老师"));
    38. String girlName = getGirlName(boy);
    39. System.out.println(girlName);
    40. }
    41. }
  • 相关阅读:
    环境配置之终端WezTerm
    线程状态与线程安全
    SpringBoot项目中使用MultipartFile来上传文件(包含多文件)
    单片机涉及到这么多行业?
    训练环境搭建过程中遇到的一些问题
    Linux 文本处理命令 - chmod
    leetcode做题笔记155. 最小栈
    echart 设置 legend.type=“scroll“ 翻页时,中文上面被截取,显示不完整,解决办法
    企业级-PDF文件下载
    基于ssm的搬家管理系统
  • 原文地址:https://blog.csdn.net/weixin_63925896/article/details/133923963