目录
第一篇:JDK8新特性一:引入介绍
第二篇:JDK8新特性二:Lambda表达式引入介绍
第三篇:JDK8新特性二:Lambda表达式规范和语法
第四篇:JDK8新特性二:方法引入详述
第五篇:JDK8新特性二:foreach、排序、线程调用简单示例
第六篇:JDK8新特性三:Stream流+常见方法演示
第七篇:JDK8新特性四:Optional类的学习
四 Optional
- Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象
- Optional是一个容器,可以保存类型T的值,或者仅仅保存null。Optional提供了空值检测方式,很好地解决了空指针异常。
1 创建Optional
-
方法
- Optional.ofNullable()
- 可以传递空对象
- Optional.of()
- 不可以传递空对象,会直接抛出NullPointerException异常
- get()
- 获取值,如果值为空,会抛出NoSuchElementException异常
- isPresent()
- 判断值是否不等于null,不等于null返回true,否则为false
- Optional.ofNullable()
-
示例代码
Integer a = 1; Integer b = null; Optional<Integer> optional1 = Optional.ofNullable(a); System.out.println(optional1.get()); Optional<Integer> optional2 = Optional.ofNullable(b); // 如果值为null,调用get()方法会抛出new NoSuchElementException("No value present") //System.out.println(optional2.get()); System.out.println(optional2.isPresent()); Optional<Integer> optional3 = Optional.of(a); System.out.println(optional3.get()); // Optional.of()方法无法接收null对象 //Optional<Integer> optional4 = Optional.of(b); //System.out.println(optional4.get());
2 给空参数设置默认值
-
方法
- orElse()
- 当值为不为null的时候,返回原值,否则返回orElse中给定的其他值
- orElse()
-
示例代码
Integer a = 1; Integer b = null; // 输出1 System.out.println(Optional.ofNullable(a).orElse(null)); // 输出null System.out.println(Optional.ofNullable(b).orElse(null));
3 参数过滤
-
方法
- filter()
- 如果值存在并且能够匹配所给定的断言,就会返回一个Optional对象,否则返回一个空的Optional对象
- filter()
-
示例代码
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5); // 判断是否含有3,如果有则返回整个List,否则返回null List<Integer> result = Optional.ofNullable(integerList).filter(f -> f.contains(3)).orElse(null); System.out.println(result);
4 结合Lambda表达式案例
4.1 案例1-对于String
-
示例代码
// 优化前 String name = "meitian"; if (name != null) { logger.info(name); } // 优化后 Optional<String> optionalName = Optional.ofNullable(name); // 判断值是否为null,不为null才输出 optionalName.ifPresent(System.out::println);
4.2 案例2-实体类非空检验
-
实体
@Data @AllArgsConstructor @NoArgsConstructor public class TestEntity { private String id; private String name; }
-
示例代码
private static TestEntity testEntity = null; public static void main(String[] args) { TestEntity testEntity = TestTwo.getEntity(); System.out.println(testEntity); } private static TestEntity getEntity() { // 优化前 //if (testEntity == null) { // return creteEntity(); //} //return testEntity; // 优化后 return Optional.ofNullable(testEntity).orElseGet(() -> creteEntity()); } private static TestEntity creteEntity() { return new TestEntity("1", "Tom"); }
-
方法
- orElseGet()
- 如果值不为null,则直接返回,否则会返回Supplier匿名内部类的调用,通过调用get() 方法返回值
- orElseGet()
4.3 优化3
-
实体
@Data @AllArgsConstructor @NoArgsConstructor public class TestEntity { private String id; private String name; }
-
示例代码
// 优化前 TestEntity order = new TestEntity("1", "Tom"); //if (order != null) { // String orderName = order.getName(); // if (orderName != null) { // return orderName.toLowerCase(); // } //} //return null; //优化后 //return Optional.ofNullable(order).map(orderEntity -> { // return orderEntity.getName(); //}).map(name -> { // return name.toLowerCase(); //}).orElse(null); //Optional<TestEntity> order1 = Optional.ofNullable(order); //Optional<String> s = order1.map(TestEntity::getName); //Optional<String> s1 = s.map(String::toLowerCase); //String s2 = s1.orElse(null); //System.out.println(s2); return Optional.ofNullable(order).map(TestEntity::getName).map(String::toLowerCase).orElse(null);
-
方法
- map()
- 如果值存在,就继续使用映射函数对值进行处理,当结果不为null的时候,会返回一个Optional包装的对象,否则返回空的Optional
- map()
- 方法
- map()
- 如果值存在,就继续使用映射函数对值进行处理,当结果不为null的时候,会返回一个Optional包装的对象,否则返回空的Optional