Optional
Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException)。
本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
具体用法
public class Optional_example { public static void main(String[] args) throws Exception { //of: 为非null的值创建一个Optional。如果传入参数为null,则抛出NullPointerException Optional<String> name = Optional.of("123"); //ofNullable: 为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。 Optional<Object> empty = Optional.ofNullable(null); //empty: 一个空的Optional Optional<Object> empty1 = Optional.empty(); //get: 如果Optional有值则将其返回,否则抛出NoSuchElementException empty.get(); //isPresent: 如果值存在返回true,否则返回false name.isPresent(); //ifPresent: 如果Optional实例有值则为其调用consumer,否则不做处理 name.ifPresent(x -> { x = x + "456"; }); //orElse: 如果有值则将其返回,否则返回指定的其它值 name.orElse("默认数据"); empty.orElse(123); //orElseGet: 类似orElse;可以接受一个lambda表达式生成默认值 name.orElseGet(() -> "默认数据"); empty.orElseGet(() -> 123); //orElseThrow: 如果有值则将其返回,否则抛出异常 empty.orElseThrow(Exception::new); //map: 如果有值,则对其执行函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional name.map(x -> x.toUpperCase()); //latMap: 如果有值,为其执行函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装 name.flatMap(x -> Optional.of(x.toUpperCase())); //filter: 如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional name.filter(x -> x.length() > 2).map(x -> x.toUpperCase()); //使用Optional与Stream取代if判空逻辑 List<Apple> appleList = new ArrayList<>(); appleList.add(new Apple("red", 170)); appleList.add(new Apple("green", 150)); appleList.add(null); appleList.add(new Apple("yellow", 170)); appleList.add(new Apple("green", 170)); appleList.add(new Apple("red", 170)); //例子: 先判断appleList是否为空,如果为空则返回空list;不为空则过滤元素为空,再过滤color是green的,再找到第一个green元素返回 //最后用orElse来获取可以避免空指针异常 Apple apple = Optional.ofNullable(appleList).orElseGet(() -> { return new ArrayList<>(); }).stream().filter(Objects::nonNull).filter(x -> "green".equals(x.getColor())).findFirst().orElse(null); System.out.println(apple); } }

浙公网安备 33010602011771号