superT

JAVA8之妙用Optional解决判断Null为空的问题

妖精的绣舞 提交于 2019-11-26 17:11:20
引言 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince() ; 这种写法,在user为null时,是有可能报NullPointerException异常的。为了解决这个问题,于是采用下面的写法 if (user!= null ){ Address address = user.getAddress() ; if (address!= null ){ String province = address.getProvince() ; } } 这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明 API介绍 先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。而不像其他文章一样,一个个API罗列出来,让人找不到重点。 1、Optional(T value),empty(),of(T value),ofNullable(T value) 这四个函数之间具有相关性,因此放在一组进行记忆。 先说明一下, Optional(T value) ,即构造函数,它是private权限的

java8 -函数式编程之Optional

丶灬走出姿态 提交于 2019-11-26 17:10:17
前言 在某些情况下,首先要判断某个参数或者某个方法的返回值是否为null,才能继续操作该参数。对于某些链式操作需要多次通过if语句判断是否为空,才能确保不抛出NullPointerException,这段非空判断的代码显得非常冗长和恶心。比如下面这段代码: String isoCode = "default"; if (user != null) { Address address = user.getAddress(); if (address != null) { Country country = address.getCountry(); if (country != null) { isocode = country.getIosCode(); if (isocode != null) { isocode = isocode.toUpperCase(); } } } } 在java 8里,JDK引入了一个Optional类,该类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。通过本文的学习,我们看下如何通过Optional类重写上面那段判空代码。 接下来,我们一起学习Optional类的初始化和它里面的方法。lambda表达式和四个基本函数式接口是本文的基础,可以通过 java8

10 道关于 Java 泛型的面试题

社会主义新天地 提交于 2019-11-26 16:24:32
1.Java中的泛型是什么 ? 使用泛型的好处是什么? 这是在各种Java泛型面试中,一开场你就会被问到的问题中的一个,主要集中在初级和中级面试中。那些拥有Java1.4或更早版本的开发背景的人都知道,在集合中存储对象并在使用前进行类型转换是多么的不方便。 泛型较为准确的说法就是为了参数化类型,或者说可以将类型当作参数传递给一个类或者是方法。 泛型防止了那种情况的发生。它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中,避免了在运行时出现ClassCastException。 2. Java的泛型是如何工作的 ? 什么是类型擦除 ? 这是一道更好的泛型面试题。泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List<String>在运行时仅用一个List来表示。这样做的目的,是确保能和Java 5之前的版本开发二进制类库进行兼容。 你无法在运行时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型。根据你对这个泛型问题的回答情况,你会得到一些后续提问,比如为什么泛型是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误泛型代码。更多请参考这篇文章《 揭开Java 泛型类型擦除神秘面纱 》 3. 什么是泛型中的限定通配符和非限定通配符 ? 这是另一个非常流行的Java泛型面试题