Optional-java8特性
来源:互联网 发布:产品排名优化流程 编辑:程序博客网 时间:2024/06/05 22:57
使用场景:
- 结合lambda表达式使用;
- 将返回值元素放进Optional<T>中;
重要方法:
1.Optional的构造函数全部私有,因此获取起实例只能根据三个方法of(obj)、empty()和ofNullable(obj)获取,如函数名所示,三个方法分别返回有元素实例,无元素实例和和可能当无元素的实例。obj为null时,创建实例采用了单例模式,节省内存。具体即解释如下:
/** * 空实例,单例模式 * Common instance for {@code empty()}. */ private static final Optional<?> EMPTY = new Optional<>(); //构造函数都是私有的,实例都用of()、ofNullable()和empty()则三个方法获取; /** * <p>无参私有构造参数</p> */ private Optional() { this.value = null; } /** * <p>私有构造器,用已有的value值构造实例</p> */ private Optional(T value) { // Objects.requireNonNull(obj):如果是null抛异常,不是则不作处理返回; this.value = Objects.requireNonNull(value); } /** * <p>调用有参私有构造器,参数为null则抛空指针异常</p> */ public static <T> Optional<T> of(T value) { return new Optional<>(value); } /** * <p>返回不包括任何元素的实例</p> */ public static<T> Optional<T> empty() { //private static final Optional<?> EMPTY = new Optional<>();类开始的EMPTY用私有无参构造函数赋值 @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; } /** * <p>可能返回不包含元素的实例,允许参数为null</p> */ public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); }
2.元素是否存在,以及存在与否这两种情况,需要进行大致四种方式的处理,不同的情况对应着不同的函数,乱用则可能造成代码冗长
1)存在这对元素进行处理,对应t.ifPresent方法,不存在则什么都不返回;
2)存在则返回,不存在则返回默认值,对应orElse(常量var)方法;
3)存在则返回,不存在则由相应函数产生,对应orElseGet(Lambda表达式,Supplier);
4)不存在抛异常;orElseThrow(XX);
【注】涉及到包java.util.function下的类,@FunctionalInterface注解的用法
/** *存在则处理,不准在什么都不做 */ public void ifPresent(Consumer<? super T> consumer) { if (value != null) consumer.accept(value); } /** * Optional包含元素则返回元素,不包含元素则返回orElse(obj)的参数obj; */ public T orElse(T other) { return value != null ? value : other; } /** * Optional包含元素则返回元素,不包含元素则调用参数的get()方法,返回其值 * 参数可以是lambda表达式,如: * t.orElseGet(()->eleGetter())); */ public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); } /** * 无元素则抛IllegalArgumentException或及其子类异常,示例: * * t.orElseThrow(()->new IllegalArgumentException("description for Exception"); * */ public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } }//过滤valuepublic Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty(); }
其他
5)对元素进行过滤;filter(Lambda);
6)public<U> Optional<U>map(Function<?superT, ?extendsU> mapper):如果Optional包含元素,则调用函数得到返回值-用Optional包装后返回,可以为Optional(null);如果Optional不包含元素则抛空指针异常。因为返回值是Optional,因此map(XX)可以无限调用下去;
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value));//return Objects.requireNonNull(mapper.apply(value)); flatmap方法} }
阅读全文
0 0
- Optional-java8特性
- java8新特性--optional
- Java8新特性 - Optional类
- Java8新特性 - Optional类
- java8新特性---Optional类
- java8新特性(八):Optional
- Java8新特性——Optional
- 详解Java8特性之Optional类
- Java8 新特性之 Optional 类
- Java8新特性之Optional详解
- Java8-optional
- java8 Optional
- Java8 Optional
- java8新特性探究(一)optional类
- 6.如何正确使用Optional-java8新特性
- JAVA8新特性(六)——Optional API
- Java8中的Optional类
- java8系列之Optional
- Android6.0的界面设计风格MaterialDesign初探
- 板子一
- 【笔记】串的模式匹配算法
- python学习笔记6:PyCharm的进一步配置
- 使用脚手架构建及配置Vue2.0+ElementUI项目
- Optional-java8特性
- 词向量源码解析:(6.7)fasttext源码解析之词向量1
- JavaScript忍者秘籍笔记02之闭包
- 贪心法-区间问题-今年暑假不AC
- 【正则表达式】正则表达式进阶
- Java注解基本原理
- Map 的 使用方法和内容
- tcp/ip学习笔记--第4章 arp协议
- Oracle之分区truncate、drop、add等索引失效分分析