Java8之Optional简介说明
下文笔者讲述java8中Optional的简介说明,如下所示
Optional简介
Optional是一个容器类 常指一个值存在或不存在 由于java中没有空安全类型,任何对象都可能出现null 从而导致NullPointerException异常 即Optional出现使 我们可以更好的处理null值下文笔者将依次讲述Optional的相关操作简介说明,如下所示
创建Optional对象
创建一个非空的Optional // 使用of方法创建包含值的Optional。参数不能为null,否则会立即抛出NullPointerException。 Optional<String> optional = Optional.of("Hello World");
创建一个可能为空Optional
// 使用ofNullable方法创建可以包含null的Optional 当参数为null 它将创建一个空Optional对象 Optional<String> optionalNullable = Optional.ofNullable(null);
访问Optional对象值
使用get()方法 获取Optional值 当Optional为空则抛出NoSuchElementException异常 String value = optional.get();
使用isPresent()方法来检查Optional是否有值
// isPresent方法用于检查Optional实例中是否包含非null值。 if (optional.isPresent()) { System.out.println("Value found - " + optional.get()); } 使用ifPresent()方法进行更优雅的检查和使用 // ifPresent方法接收一个Consumer(消费者)参数 仅当Optional中有值存在时,才执行传入的Lambda表达式(或方法引用)。 optional.ifPresent(value -> System.out.println("Value found - " + value)); 在Optional为空的时候提供一个备用值 可使用orElse()方法 // orElse方法允许在Optional对象不包含值时提供一个备选值。 String nullDefault = optionalNullable.orElse("Default Value"); System.out.println(nullDefault); // 输出:Default Value 或 使用orElseGet()方法进行延迟计算备用值 String value = optional.orElseGet(() -> "default value");
链式调用Optional
Optional支持链式方法调用 如map和flatMap 使得它能够和Java 8其他特性 如: Stream和lambda表达式一起更好地工作
map和flatMap
map和flatMap方法 在函数式编程中用得非常广泛 在Optional中被定义: // 假设有一个方法parse(String str),str可能为null,解析后的结果也可能为null Optional<String> str = Optional.ofNullable(getStr()); // 不使用map,我们需要进行两次null检查 if(str != null){ String result = parse(str); if(result != null){ System.out.println(result); } } // 使用Optional和map,可以避免显示null检查 str.map(this::parse).ifPresent(System.out::println); 注意 map操作需要Function作为参数 方法不能返回Optional类型 如果你要返回Optional 你应该使用flatMap 否则你会得到套装的Optional // 使用map,你会得到Optional<Optional<Integer>> Optional<Optional<Integer>> nestedOptional = str.map(this::parseToOptional); // 使用flatMap,你会得到Optional<Integer> Optional<Integer> flatOptional = str.flatMap(this::parseToOptional);
filter
filter方法与Stream中的filter类似 接收Predicate参数 用于测试Optional中是否有值符合给定的条件 Optional<String> filtered = str.filter(val -> val.length() > 3); // 如果Optional中的值长度大于3,那么仍旧返回包含该值的Optional // 否则返回一个空的Optional实例
Optional并不是用来替换所有的null 将会减少Bug的出现
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。