Optional源码解析与实践( 三 )

  • orElseGet(Supplier other): 如果optional不为空 , 则返回optional中的对象;如果为null , 否则调用其他函数并返回调用的结果
  • orElseThrow(Supplier exception): 如果optional不为空 , 则返回optional中的对象;如果为null , 则抛出Supplier函数生成的异常
  • 3)测试代码
    1. public static void main(String[] args) {
    2. Integer value1 = null;
    3. Integer value2 = 1;
    4. Optional<Integer> optional1 = Optional.ofNullable(value1);
    5. Optional<Integer> optional2 = Optional.of(value2);
    6. try {
    7. if(optional1.isPresent()){
    8. System.out.println("optional1的isPresent结果不为空");
    9. }else{
    10. System.out.println("optional1的isPresent结果为空");
    11. }
    12. }catch (Exception e){
    13. System.out.println("optional1的isPresent判空失败,原因:"+e.getMessage());
    14. }
    15. try {
    16. if(optional2.isPresent()){
    17. System.out.println("optional2的isPresent结果不为空");
    18. }else{
    19. System.out.println("optional2的isPresent结果为空");
    20. }
    21. }catch (Exception e){
    22. System.out.println("optional2的isPresent判空失败,原因:"+e.getMessage());
    23. }
    24. optional1.ifPresent(t->{
    25. int i =t+1;
    26. System.out.println("optional1处理后的值是"+i);
    27. });
    28. optional2.ifPresent(t->{
    29. int i =t+1;
    30. System.out.println("optional2处理后的值是"+i);});
    31. Integer value3 = 2;
    32. Integer result = optional1.orElse(value3);
    33. System.out.println("optional1执行orElse处理后的值是"+result);
    34. result = optional2.orElse(value3);
    35. System.out.println("optional2执行orElse处理后的值是"+result);
    36. result = optional1.orElseGet(()-> new Integer(-1));
    37. System.out.println("optional1执行orElseGet处理后的值是"+result);
    38. result = optional2.orElseGet(()-> new Integer(-1));
    39. System.out.println("optional2执行orElseGet处理后的值是"+result);
    40. try {
    41. result = optional1.orElseThrow (()-> new RuntimeException("值是空的"));
    42. System.out.println("optional1执行orElseThrow处理后的值是"+result);
    43. }catch (Exception e){
    44. System.out.println("optional1的orElseThrow抛出异常:"+e.getMessage());
    45. }
    46. try {
    47. result = optional2.orElseThrow (()-> new RuntimeException("值是空的"));
    48. System.out.println("optional2执行orElseThrow处理后的值是"+result);
    49. }catch (Exception e){
    50. System.out.println("optional2的orElseThrow抛出异常:"+e.getMessage());
    4)运行结果
    Optional源码解析与实践

    文章插图
    2.3.5 过滤方法1)源码
    1. public Optional<T> filter(Predicate<? super T> predicate) {
    2. Objects.requireNonNull(predicate);
    3. if (!isPresent())
    4. return this;
    5. else
    6. return predicate.test(value) ? this : empty();

      经验总结扩展阅读