java optional使用,java optional.of
00-1010 I .可选类别II的来源。什么是可选的III类。可选类别IV的使用。代码示例1。创建可选的II类。确定可选容器是否包含对象III。获取可选容器的对象IV。过滤器5。地图5。什么场景用Optional1,场景I 2,场景II 3,场景III 4,场景IV。
到目前为止,臭名昭著的空指针异常是Java应用程序失败的最常见原因。过去,为了解决空指针异常,Google著名的Guava项目引入了Optional类。Guava通过检查空值来防止代码污染,并鼓励程序员编写更干净的代码。受谷歌番石榴的启发,可选类成为了Java 8类库的一部分。
目录
可选类(java.util.Optional)是一个容器类,可以保存T类型的值,表示这个值存在。或者只保存null,表示这个值不存在。本来null表示一个值不存在,现在Optional更能表达这个概念。并且可以避免空指针异常。
Optional提供了许多有用的方法,因此我们不必显式地检测空值。
一、Optional类的来源
可选类的Javadoc描述如下:这是一个可以为空的容器对象。
如果值存在,isPresent()方法将返回true,调用get()方法将返回对象。
如果该值不存在,isPresent()方法将返回false,调用get()方法将NPE。
创建Optional类对象的方法:
Optional.of(T t) :创建一个可选实例,T必须非空;
创建一个空的可选实例
可选。of nullable (t t): t可以为空。
判断Optional容器中是否包含对象:
Boolean isPresent() :确定是否包含一个对象。
void ifPresent(消费者?TConsumer):如果有值,执行消费者接口的实现代码,值将作为参数传递给它。
获取Optional容器的对象:
Get () :如果调用对象包含值,则返回值,否则抛出异常。
否则(thother):如果有值,则返回;否则,返回指定的其他对象。
T orElseGet(供应商?Ends other):如果有值,则返回,否则返回供应商接口实现提供的对象。
T orElseThrow(供应商?Extends X exceptionSupplier):如果有值,则返回;否则,抛出由供应商接口实现提供的异常。
过滤:
可选过滤器(谓词?Superpredicate):如果该值存在,并且该值与给定的predict匹配,则返回一个描述该值的可选值,否则,返回一个空的可选值。
映射
UOptionalU映射(函数?超T,Extends U mapper):如果有值,调用映射函数来获取返回值。如果返回值不为空,创建一个可选的包含映射的返回值作为map方法的返回值;否则,返回一个空的可选。
U OptionalU平面图(函数?Super T,OptionalU mapper):如果值存在,则对该值执行提供的映射函数调用,返回可选值;否则,返回一个空的可选对象。
二、Optional类是什么
@ Data @ AllArgsConstructor @ NoArgsConstructorclass Student { private String name;私有整数年龄;}
三、Optional类用法
public void test1() { /
/ 声明一个空Optional Optional<Object> empty = Optional.empty(); // 依据一个非空值创建Optional Student student = new Student(); Optional<Student> os1 = Optional.of(student); // 可接受null的Optional Student student1 = null; Optional<Student> os2 = Optional.ofNullable(student1);}
2、判断Optional容器中是否包含对象
isPresent不带参数,判断是否为空,ifPresent可以选择带一个消费函数的实例。(isPresent和ifPresent一个是 is 一个是 if 注意一下哈)
public void test1() { Student student = new Student(); Optional<Student> os1 = Optional.ofNullable(student); boolean present = os1.isPresent(); System.out.println(present); // 利用Optional的ifPresent方法做出如下:当student不为空的时候将name赋值为张三 Optional.ofNullable(student).ifPresent(p -> p.setName("张三"));}
3、获取Optional容器的对象
public void test1() throws Exception { Student student = null; Optional<Student> os1 = Optional.ofNullable(student); // 使用get一定要注意,假如student对象为空,get是会报错的 // java.util.NoSuchElementException: No value present Student student1 = os1.get(); // 当student为空的时候,返回我们新建的这个对象,有点像三目运算的感觉 Student student2 = os1.orElse(new Student("张三", 18)); // orElseGet就是当student为空的时候,返回通过Supplier供应商函数创建的对象 Student student3 = os1.orElseGet(() -> new Student("张三", 18)); // orElseThrow就是当student为空的时候,可以抛出我们指定的异常 os1.orElseThrow(() -> new Exception());}
4、过滤
public void test1() { Student student = new Student("李四", 3); Optional<Student> os1 = Optional.ofNullable(student); os1.filter(p -> p.getName().equals("张三")).ifPresent(x -> System.out.println("OK"));}
5、映射
map代码示例:
public void test1() { Student student = new Student("李四", 3); Optional<Student> os1 = Optional.ofNullable(student); // 如果student对象不为空,就加一岁 Optional<Student> emp = os1.map(e -> { e.setAge(e.getAge() + 1); return e; }); }
这块的map说实话对lambda不是很熟练的 理解起来是很绕脑子的。
这里的map实际上就是用的Function函数,Function函数是有两个参数的,第一个是入参数据类型,第二个是返回数据类型。Function函数作用就是传入一个对象,然后返回一个对象,返回的对象类型可以自己设置。
T 就是代表实例的泛型数据类型,就是谁调用的 入参 必须跟调用者泛型的数据类型一样。
U 就是自己说了算,调用完map之后返回什么数据类型,那么U就设置什么
flatMap代码示例: flatMap跟map是一样的只不过他返回的是optional对象。
public static Optional<Integer> stringToInt(String s) { try { return Optional.of(Integer.parseInt(s)); } catch (NumberFormatException e) { e.printStackTrace(); return Optional.empty(); } }
Optional.ofNullable(props.getProperty(name)) .flatMap(OptionalUtils::stringToInt) .filter(i -> i>0) .orElse(0);
五、什么场景用Optional
以前一直不懂Optional有啥用,感觉太无语了,Java8还把它当做一个噱头来宣传,最近终于发现它的用处了,当然不用函数式编程的话,是没感觉的;
如下提供了几个应用场景,基本上都是开发当中经常遇到的。
1、场景一
PatientInfo patientInfo = patientInfoDao.getPatientInfoById(consultOrder.getPatientId());if (patientInfo != null) { consultInfoResp.setPatientHead(patientInfo.getHead());}// 使用Optional 和函数式编程,一行搞定,而且像说话一样Optional.ofNullable(patientInfo).ifPresent(p -> consultInfoResp.setPatientHead(p.getHead()));
2、场景二
public void test1() throws Exception { Student student = new Student(null, 3); if (student == null isEmpty(student.getName())) { throw new Exception(); } String name = student.getName(); // 业务省略... // 使用Optional改造 Optional.ofNullable(student).filter(s -> !isEmpty(s.getName())).orElseThrow(() -> new Exception());}public static boolean isEmpty(CharSequence str) { return str == null str.length() == 0;}
3、场景三
public static String getChampionName(Competition comp) throws IllegalArgumentException { if (comp != null) { CompResult result = comp.getResult(); if (result != null) { User champion = result.getChampion(); if (champion != null) { return champion.getName(); } } } throw new IllegalArgumentException("The value of param comp isnt available.");}
这个在开发中是很常见的一种逻辑。去判读传进来的参数时候为空,或者是从数据库中获取的对象。由于某些原因,我们不能很流程的直接这样写。
comp.getResult().getChampion().getName()
上面的写法用Optional改写:
public static String getChampionName(Competition comp) throws IllegalArgumentException { return Optional.ofNullable(comp) .map(Competition::getResult) // 相当于c -> c.getResult(),下同 .map(CompResult::getChampion) .map(User::getName) .orElseThrow(()->new IllegalArgumentException("The value of param comp isnt available."));}
4、场景四
类型之间的转换,并且当没有值的时候返回一个默认值
int timeout = Optional.ofNullable(redisProperties.getTimeout()) .map(x -> Long.valueOf(x.toMillis()).intValue()) .orElse(10000);
到此这篇关于详解Java中Optional类的使用方法的文章就介绍到这了,更多相关Java Optional类内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。