zoukankan      html  css  js  c++  java
  • JDK_8新特性_Optional容器类

    传统方式处理null

    public class TestOptional1 {
    
    	/**
    	 * null-安全的第一种尝试:深层质疑
    	 * @param person
    	 * @return
    	 */
    	public String getCarInsuranceName1(Person person) { 
    		if (person != null) {
    			Car car = person.getCar();
    			if (car != null) {
    				Insurance insurance = car.getInsurance();
    				if (insurance != null) {
    					return insurance.getName();
    				}
    			}
    		}
    		return "Unknown";
    	}
    
    	/**
    	 * null-安全的第二种尝试:过多的退出语句
    	 * @param person
    	 * @return
    	 */
    	public String getCarInsuranceName2(Person person) {
    		if (person == null) {
    			return "Unknown";
    		}
    		Car car = person.getCar();
    		if (car == null) {
    			return "Unknown";
    		}
    		Insurance insurance = car.getInsurance();
    		if (insurance == null) {
    			return "Unknown";
    		}
    		return insurance.getName();
    	} 
    }
    
    class Person {
    	private Car car;
    	public Car getCar() { return car; }
    }
    class Car {
    	private Insurance insurance;
    	public Insurance getInsurance() { return insurance; }
    }
    class Insurance {
    	private String name;
    	public String getName() { return name; }
    } 
    

      

    Optional容器类避免null

    import java.util.Optional;
    
    /**
     * Optional类方法
     * 
     * empty 		返回一个空的 Optional 实例
     * filter		如果值存在并且满足提供的谓词,就返回包含该值的 Optional 对象;否则返回一个空的Optional 对象
     * flatMap		如果值存在,就对该值执行提供的 mapping 函数调用,返回一个 Optional 类型的值,否则就返回一个空的 Optional 对象
     * get 			如果该值存在,将该值用 Optional 封装返回,否则抛出一个 NoSuchElementException 异常
     * ifPresent 	如果值存在,就执行使用该值的方法调用,否则什么也不做
     * isPresent 	如果值存在就返回 true,否则返回 false
     * map 			如果值存在,就对该值执行提供的 mapping 函数调用
     * of			将指定值用 Optional 封装之后返回,如果该值为 null,则抛出一个 NullPointerException异常
     * ofNullable 	将指定值用 Optional 封装之后返回,如果该值为 null,则返回一个空的 Optional 对象
     * orElse 		如果有值则将其返回,否则返回一个默认值
     * orElseGet 	如果有值则将其返回,否则返回一个由指定的 Supplier 接口生成的值
     * orElseThrow 	如果有值则将其返回,否则抛出一个由指定的 Supplier 接口生成的异常
     */
    public class TestOptional2 {
    
        public String getCarInsuranceName(Optional<Person> person) {
            return person.flatMap(Person::getCar)
                         .flatMap(Car::getInsurance)
                         .map(Insurance::getName)
                         .orElse("Unknown");
        }
    }
    
    class Person {
    	private Optional<Car> car;
    	public Optional<Car> getCar() { return car; }
    }
    class Car {
    	private Optional<Insurance> insurance;
    	public Optional<Insurance> getInsurance() { return insurance; }
    }
    class Insurance {
    	private String name;
    	public String getName() { return name; }
    }
    

  • 相关阅读:
    hdu 2275数据结构水题
    咨询工具、模型、方法论学习笔记 序
    DevExpress DXperience XtraTreeview 如何获取当前光标所在位置的 Node
    Delphi 各个编译版本的开关值
    把对象序列化到文件中和从文件中反序列化的管理类
    Advantech 硬件控制卡的 c# 接口函数
    Delphi 中的 TTimer 和 .NET Framework 中的 Timer 的计时周期研究
    C#设计模式编程之抽象工厂模式新解
    敏捷开发
    关于HTML静态页面(含自动分页)生成的可行性方案
  • 原文地址:https://www.cnblogs.com/Small-music/p/9485753.html
Copyright © 2011-2022 走看看