范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Java8特性Optional类源码阅读

  Optional类隶属于java.util包中
  Optional 类是一个可以为null的容器对象,它的出现很好的解决空指针异常。
  简而言之,这个类的出现,相当于Java8提供了一个封装好的容器,在使用的时候可以放心大胆的处理null的逻辑或异常。需要把值放入容器中,后续的取值操作和其他逻辑,使用其提供的Api即可方便简单的处理null指针的情况。
  Optional类的源码数量并不多,有时间还是可以看看的,先看看3个初始化容器内容的静态方法,(empty,of,ofNullable),由于所有构造函数都是private的,所以只能使用工厂方法来获取Optional的实例
  在类中第一行便是定义了一个静态常量 EMPTY  ,泛型的使用的是通配符 ?  ,意思是可以传入任意类型,并赋值为空参构造实例,第二行定义为 final  的 value  ,则是用于存储放入容器中的值     /**      * Common instance for {@code empty()}.      */     private static final Optional<?> EMPTY = new Optional<>();          /**      * If non-null, the value; if null, indicates no value is present      */     private final T value;                   private Optional() {         this.value = null;     }静态方法empty
  这个方法作用很简单,就是将类加载时初始化的 EMPTY  静态常量强转成传入的泛型T  ,然后返回强转后的值,可以调用该方法返回一个值为null  的Optional  容器    public static Optional empty() {         @SuppressWarnings("unchecked")         Optional t = (Optional) EMPTY;         return t;     }
  使用方式,声明一个 value  类型为 String  的空容器     Optional empty = Optional.empty();静态方法of
  这个方法相当于要求传入一个值,该值会做为容器中的值,调用顺序是传入值后,调用 Optional  的构造方法,而构造方法会调用 Objects.requireNonNull  方法去判断传入的值是否为空,如果为空则直接抛出空指针异常 NullPointerException  ,不为空则返回值并赋值给成员属性 value      public static  Optional of(T value) {         return new Optional<>(value);     }          private Optional(T value) {         this.value = Objects.requireNonNull(value);     }
  构造函数中调用的 Objects  类的 requireNonNull  方法     public static  T requireNonNull(T obj) {         if (obj == null)             throw new NullPointerException();         return obj;     }
  使用方式,声明一个容器,并且值为123,通过实例方法 get  可以获取出使用 of  方法初始化的值         Optional a = Optional.of(123);         Integer integer = a.get();静态方法ofNullable
  这个方法逻辑比较简单,判断传入的值是否为空,为空则调用上面说的 empty  方法,不为空则调用上面说的of  方法    public static  Optional ofNullable(T value) {         return value == null ? empty() : of(value);     }下面看看一些实例方法是怎么实现的get方法
  在 of  方法中演示过用法了,其作用就是返回当前容器中value  的值,如果为value为空则直接抛出NoSuchElementException  异常    public T get() {         if (value == null) {             throw new NoSuchElementException("No value present");         }         return value;     }isPresent方法
  判断当前容器中 value  的值是否为空,并返回一个boolean  值    public boolean isPresent() {         return value != null;     }
  使用:先判断值是否为空,如果为空直接调用 get  方法会报错 if (optional.isPresent()) {     p = optional.get(); }ifPresent方法
  判断当前容器中 value  的值是否为空,空则什么都不做,不为空则将value  传入Consumer  的accept  中执行    public void ifPresent(Consumer<? super T> consumer) {         if (value != null)             consumer.accept(value);     }
  java.util.function.Consumer  是JDK提供的函数接口,包含了一个无返回值的带参的方法:  void accept(T t)  ,传入一个泛型类型的参数并执行一些操作。 由于这是一个函数式接口,可以使用传统的 匿名内部类  编写,也可以使用 Lambda表达式  , 函数接口  和 Lambda表达式  在这里不再赘述 @FunctionalInterface public interface Consumer {      /**      * Performs this operation on the given argument.      *      * @param t the input argument      */     void accept(T t); }
  使用:分别采取了 匿名内部类  和 lambda表达式  的方式编写,由于 value  不为 null  ,所以都会执行accept方法并输出 test  字符串     Optional data = Optional.of("test");          data.ifPresent(new Consumer() {         @Override         public void accept(String s) {             System.out.println(s);         }     });      data.ifPresent(System.out::println);orElse方法
  判断当前容器中 value  的值是否为空,不为空则返回value  ,空则返回传入的值    public T orElse(T other) {         return value != null ? value : other;     }
  使用:由于容器中的值为空,所以会返回 test  字符串     Optional empty = Optional.empty();     System.out.println(empty.orElse("test"));orElseGet方法
  判断当前容器中 value  的值是否为空,不为空则返回value  ,空则调用Supplier  实例的get方法,<? extends T>  的作用为返回值类型只能是T类型  或T的子类型      public T orElseGet(Supplier<? extends T> other) {         return value != null ? value : other.get();     }
  java.util.function.Supplier  是JDK提供的函数接口,包含了一个无参的方法:  T get()  , 用来返回一个泛型参数指定类型的对象 @FunctionalInterface public interface Supplier {      /**      * Gets a result.      *      * @return a result      */     T get(); }
  使用:分别采取了 匿名内部类  和 lambda表达式  的方式编写,由于 value  的值为 null  ,所以最终返回值都是 Supplier实例  的 get方法  返回值     Optional empty = Optional.empty();              String anonymity = empty.orElseGet(new Supplier() {         @Override         public String get() {             return "anonymity";         }     });     String lambda = empty.orElseGet(() -> "lambda");              System.out.println(anonymity);     System.out.println(lambda);     // 输出两行字符串,"anonymity"和"lambda"orElseThrow方法
  和orElseGet类似,泛型函数的泛型   作用为返回值类型只能是Throwable  类型或Throwable  的子类型,如果值为空,则直接抛出一个异常    public  T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {         if (value != null) {             return value;         } else {             throw exceptionSupplier.get();         }     }
  使用:分别采取了 匿名内部类  和 lambda表达式  的方式编写,由于 value  的值为 null  ,所以最终返回值都是 Supplier实例  的 get方法  返回值,可以直接往上抛异常或者 try catch  捕获处理,这段代码执行后便会抛出任意一个异常     public static void main(String[] args) throws Exception {         Optional empty = Optional.empty();          // 这段注释掉则抛出后面的lambda表达式返回的异常         empty.orElseThrow(new Supplier() {             @Override             public IllegalArgumentException get() {                 return new IllegalArgumentException("value is null,from anonymity");             }         });          // 这段注释掉则抛出匿名内部类返回的异常         empty.orElseThrow((Supplier) () -> new IllegalArgumentException("value is null,from lambda"));     }map方法
  首先判断参数mapper是否为空,空则抛出空指针异常,再判断当前容器中 value  的值是否为空,空则调用 empty  方法,不为空则返回 ofNullable  方法的返回值, ofNullable  的参数为 mapper  的返回值,mapper类型为 Function  类型,和上面讲过的 Supplier  类似,作用就是如果值不为空,可以执行一个函数进行二次逻辑数据处理并返回。这个 mapper  函数有两个泛型 T和U  , T  是定义在 Optional  类名上的, public  后面紧跟的   作用是声明这个方法有一个泛型 U  (声明为泛型方法),Function的泛型参数则限定了第一个参数为 T类型  或 T的父类型  ,第二个参数为 U类型  或 U的子类型      public Optional map(Function<? super T, ? extends U> mapper) {         Objects.requireNonNull(mapper);         if (!isPresent())             return empty();         else {             return Optional.ofNullable(mapper.apply(value));         }     }
  java.util.function.Function  是JDK提供的函数接口,方法applay的作用就是传入一个值,返回另一个值 @FunctionalInterface public interface Function {      /**      * Applies this function to the given argument.      *      * @param t the function argument      * @return the function result      */     R apply(T t); }
  使用:分别采取了 匿名内部类  和 lambda表达式  的方式编写,由于 value  的值不为空,两个变量接受的 Optional  实例中的值都为 3      Optional data = Optional.of("test");          Optional integer = data.map(new Function() {         @Override         public Integer apply(String s) {             return s.length() > 3 ? 1 : 0;         }     });     Optional integer2 = data.map(s -> s.length() > 3 ? 1 : 0);          System.out.println(integer.get());     System.out.println(integer2.get());     // 输出两行字符串3flatMap方法
  首先判断参数mapper是否为空,空则抛出空指针异常,再判断当前容器中value的值是否为空,空则调用empty方法,不为空则调用Objects.requireNonNull函数的返回值,将mapper.apply返回值传入,如果apply方法的返回值为空则会抛出异常,使用的方法与map非常类似,唯一区别是map返回值会被调用ofNullable方法进行容器包装,而flatMap要求直接返回Optional容器    public Optional flatMap(Function<? super T, Optional> mapper) {         Objects.requireNonNull(mapper);         if (!isPresent())             return empty();         else {             return Objects.requireNonNull(mapper.apply(value));         }     }
  使用:分别采取了 匿名内部类  和 lambda表达式  的方式编写,使用 匿名内部类  编写的 applay  方法返回了一个值为数字 1  的容器,可调用 get  输出,使用 lambda表达式  编写的因为执行 Objects.requireNonNull(null)  所以抛出异常     Optional data = Optional.of("test");          Optional integer = data.flatMap(new Function>() {         @Override         public Optional apply(String s) {             return Optional.of(1);         }     });      System.out.println(integer.get());     // 输出字符串1          data.flatMap(s -> null);     // 执行到这里就会抛出异常,因为调用了Objects.requireNonNull(null)filter方法
  首先判断参数predicate是否为空,空则抛出空指针异常,再判断当前容器中value的值是否为空,空则返回当前实例,不为空则返回一个三元表达式,会将当前容器的值传入predicate.test函数中,返回一个boolean值,如果true则返回当前实例,否则调用empty函数返回一个空容器,作用就是过滤筛选值。Predicate也是一个函数接口。    public Optional filter(Predicate<? super T> predicate) {         Objects.requireNonNull(predicate);         if (!isPresent())             return this;         else             return predicate.test(value) ? this : empty();     }
  java.util.function.Predicate  是JDK提供的函数接口,方法test的作用就是传入一个值,返回一个 boolean  值 @FunctionalInterface public interface Predicate {      /**      * Evaluates this predicate on the given argument.      *      * @param t the input argument      * @return {@code true} if the input argument matches the predicate,      * otherwise {@code false}      */     boolean test(T t); }
  使用:分别采取了 匿名内部类  和 lambda表达式  的方式编写,由于 rightly  的 value  值不为空,会输出 test  ,而 falsely.get()  则会抛出异常     Optional data = Optional.of("test");     Optional rightly = data.filter(new Predicate() {         @Override         public boolean test(String s) {             return s.equals("test");         }     });     Optional falsely = data.filter(s -> s.equals(""));              System.out.println(rightly.get());     System.out.println(falsely.get());     // 会先输出一次"test"     // 然后falsely.get时就会抛出异常,因为value为null 至此,Optional类中所有的方法和逻辑都阅读完了,源码清晰简单,阅读一遍明白其中的逻辑,对该工具类的使用会有一定的帮助。:)
鹿晗吴磊最新剧穿越火线收视破千万!冲这演员阵容也得追鹿晗,这位男明星想必观众们再熟悉不过啦,他可是我国的顶级流量,不管是回国前还是回国后都有着超高的人气。最近,娱乐圈传出好消息,继甜蜜暴击后,鹿晗终于有新剧来袭穿越火线已杀青!鹿晗黑疯狂马斯克再出狂语2050年前在火星建立特斯拉工厂马斯克的疯狂世人皆知,但即使如此,他最近的发言还是再次引起热议。近日,在美国得克萨斯州奥斯汀举行的特斯拉2021年股东大会上,马斯克表述了自己的两个小目标一特斯拉或推出电动飞机。马做工资系统用什么软件?快速搞定千人复杂考勤薪资国家税务局发布公告,规定相关纳税人需要在2021年3月1日至6月30日办理2020年度个税综合所得汇算清缴。依据税法规定,符合下列情形之一的,纳税人需要办理年度汇算已预缴税额大于年征集丨遇见贵州,人间烟火抚人心2021摄影大展9月27日,由中国文联摄影艺术中心贵州省青年摄影家协会作为主办单位发起,中摄协国际文化传媒(北京)有限公司承办,贵州中烟工业有限责任公司以及新浪贵州协办的2021全国主题摄影大赛正质感很不错,五菱星辰预计三季度上市人民需要什么,五菱就造什么,最近五菱全球银标首款车型星辰已经陆续到达全国4S店。五菱星辰是五菱汽车首款银标SUV车型,已经在上海车展亮相,定位紧凑型SUV,搭载1。5T涡轮增压发动国庆档神仙打架,刘昊然彭昱畅霸屏,网友稳了2020年国庆档期格外热闹。7部电影夺冠姜子牙我和我的家乡一点就到家木兰横空出世海底小纵队火焰之环以及奇妙王国之魔法奇缘非常让人期待,神仙打架一样的电影档期,你最喜欢哪一部呢?这也江苏卫视大剧汇集!11部好剧,12档综艺堪称神仙打架江苏卫视招商会新剧片花,现场曝光多档综艺和电视剧新内容。11部新剧,12档最新综艺,网友直呼过瘾。这么多好节目,先看哪一个比较好呢?电视剧方面你最喜欢看哪一部?1。乔家的儿女白宇宋佛山豪景花园有质感的客厅才有格调基本情况简介实施方类别影音设计师案例类别客厅影院位置及周边概括性描述坐落在佛山南海私家别墅豪景花园资金投入总造价3。5万人民币空间信息别墅的三楼于25。1(长5。55m宽4。52m发射成功!关键时刻太原发射中心干了件大事,我国首颗探日卫星飞天近些年来,在中国人民的奋勇直追下,中国在航天领域取得了许多突破。在这关键时刻,太原发射中心干了一件大事,并且传来了发射成功的好消息。10月14日,长征二号丁运载火箭在太原发射中心点美国亮丽风景线再现!大批抗议者涌向白宫,警告拜登该兑现承诺了据美国媒体报道,本周一,大量民众聚集在美国首都街头举行抗议活动,美国街头又再次出现了亮丽风景线。这些抗议者大肆涂画美前总统杰克逊的雕像,以及不顾一切地涌向白宫。本次抗议活动为期5天中国超越美国成世界第一!普京最新表态中国是俄罗斯最可靠伙伴俄罗斯是中国的重要邻国,也是世界上影响力较大的国家之一。近些年来,中俄两国的发展方向,同中美两国的发展方向截然不同。虽然中俄也有存在差异的地方,但是,中俄却没有选择放大分歧,而是通
FonePawVideoConverterUltimate在PS3上转换和播放MKV?MKV是一种容器格式,广泛用于传输高达1080p的高清视频内容。问题是许多媒体设备不能以MKV文件格式本地播放文件,FonePawVideoConverterUltimate(打开如何关闭Mac电脑键盘上的Fn功能?mac电脑键盘上的F1到F12的键位都对应着调节亮度声音等功能,如果要使用F1键,必需使用FnF1这样的组合键才能达到效果。怎么样关闭键盘上的Fn功能,默认按F1就是F1呢?快来看DxO系列软件产品与操作系统以及第三方软件的兼容性介绍DxO系列产品是设计师为摄影师设计的创意照片编辑软件,是大家解决创意摄影各个方面的理想解决方案。本文将会为大家介绍DxOPhotoLabDxOPureRAWDxOFilmPackD魔改起自己来不逊苹果,揭秘ARM强性能分支CortexX1在Arm与x86竞争的过去十年中,Arm已经彻底赢得了,智能手机这些低功耗设备的霸主地位。现在,Arm架构也正在步入高能耗的笔记本电脑数据中心和其他设备领域。Arm已经成为苹果生态华为芯片遭遇困境,三星苹果受益最大,麒麟真空三星能填补多少背景在过去的两年中,华为是全球最大的电信设备供应商之一,也是包括手机产品在内的消费类电子领域内,发展最快的科技品牌,即使它的手机从未进入美国这个全球最大的市场,但华为不仅研发出世界华为风格没有3nm代工但设计要跟上,高制程须有我们一席之地毫无疑问,华为的Kirin9000和Kirin9000E,让我们在5nm制程时代,世界先进移动CPU的行列里,有国产芯片的一席之地,这比任何海外供应链技术或产品的首发,真正值得我们西方惊异如此围堵华为5G份额仍稳第一,渡过危机丰田诠释答案最新5G基站占有率数据出台后,整个西方都觉得诧异在欧美市场和供应链上极尽打压之能事后,华为在2020年通信设备的市场份额,由2019年的28上升至31,份额不降反升。去年,美农村运芯片产能过剩,芯片求着人买,发生概率有多大,我们能等吗?川军团的豪杰们打拢了也凑不起这场仗,我的人凑不凑都不习惯这种仗。我的团长我的团其中的一句台词,面对一场必须接受的抗争,他们最后冲上去了。前言2020年后,依仗半导体领域技术规模知识秀存在就拿英特尔断供说事,国产CPU何时崛起?现状怎样了?华为与X86芯片商的业务交集,主要发生在桌面级和服务器领域。虽然华为有自己的鲲鹏920芯片,现阶段也可以规模量产7nm鲲鹏芯片的服务器和台式机产品,但考虑到华为目前暂时失去了先进工为何华为手机芯片危机受益最多的不是三星小米,而是美企苹果高通华为是世界上最大的电信设备供应商之一,2020年第四季度之前,也是增长最快的智能手机公司之一。尽管华为手机很久之前,就不再在美国发售,但世界科技最强国,以举国之力压制华为的发展,手芯片技术不是遏制工具,我们不同意!美企应用材料的并购梦要凉凉在半导体产业链中,最具掐脖子地位的当属芯片生产设备,先进制程的光刻机首当其冲,其次就是刻蚀机和薄膜沉积设备。虽然国产刻蚀和薄膜沉积设备已经开始崭露头角,但国内晶圆大厂如中芯国际,依