Optional详细用法
package com.example.apidemo.jdk8; import com.example.apidemo.vo.UserInfo; import java.math.BigDecimal; import java.util.Arrays; import java.util.List; import java.util.Optional; import lombok.Data; import org.junit.Test; /** * @Author Tim * @Date 2022/5/19 10:54 */ public class TestOptional { /** * Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。 * Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。 * Optional提供很多有用的方法,这样我们就不用显式进行空值检测。 * Optional 类的引入很好的解决空指针异常。 */ @Test public void test() throws Exception { String s = "2"; String value = Optional.ofNullable(s).orElse("ab"); System.out.println("Test=="+ value + "|" + value.length()); //创建一个Optional容器对象 Optional<String> optional = Optional.of("XiaoMing"); //为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。Optional有值就返回,没有抛出NoSuchElementException Optional<Object> o1 = Optional.ofNullable(null); //System.out.println(o1.get()); //orElse:如果有值则将其返回,否则返回指定的其它值 System.out.println(o1.orElse("输出orElse")); //orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值 UserInfo userInfo = null; UserInfo u1 = Optional.ofNullable(userInfo).orElse(createNew()); System.out.println(u1); UserInfo u2 = Optional.ofNullable(userInfo).orElseGet(()->createNew()); System.out.println(u2); System.out.println("----------------------------------"); //map:如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。 String s1 = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng"); System.out.println("s1=="+s1); //输出: XIAOMING //flatMap:如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。与map不同的是, // flatMap 的返回值必须是Optional,而map的返回值可以是任意的类型T Optional<String> s2 = optional.flatMap(e -> Optional.of(e.toUpperCase())); System.out.println("s2=="+s2.get()); //输出:XIAOMING //filter List<String> strings = Arrays.asList("rmb", "doller", "ou"); for (String str : strings) { String op = Optional.of(str).filter(g -> g.contains("o")).orElse("没有--包含o的"); System.out.println(op); } } //createNew private static UserInfo createNew() { return new UserInfo("用户", 50, BigDecimal.ZERO, BigDecimal.ZERO); } }
package com.example.apidemo.jdk8; import java.util.Optional; import lombok.Data; import org.junit.Test; /** * @Author Tim * @Date 2022/5/19 10:54 */ public class TestOptional2 { /** * 3种真实场景下的测试案例 */ @Test public void test() throws Exception { //用法案例1: System.out.println(getCity(new User())); System.out.println(getCity2(new User())); //用法案例2: System.out.println(getDefaultUser(new User())); System.out.println(getDefaultUser2(new User())); //用法案例3: Optional取值,如果不存在则调用一个没返回值得方法 Optional.ofNullable(new User()).ifPresent(u-> dosomething(u)); // if(user != null){ // dosomething(user); // } } private void dosomething(User u) {} //1.旧写法(循环每一层判断下面是否有值) public String getCity(User user) throws Exception{ try { if(user!=null){ if(user.getAddress()!=null){ Address address = user.getAddress(); if(address.getCity()!=null){ return address.getCity(); } } } } catch (Exception e) { throw new Exception("取值错误1"); } return "取值错误1"; } //1.新写法(用map去匹配) public String getCity2(User user) throws Exception{ return Optional.ofNullable(user) .map(u-> u.getAddress()) .map(a->a.getCity()) .orElse("取值错误2"); } //2. 以前写法 (获取指定的用户返回,没有就用默认的) public User getDefaultUser(User user) throws Exception{ if(user!=null){ String name = user.getName(); if("zhangsan".equals(name)){ return user; } return null; }else{ user = new User(); user.setName("zhangsan"); return user; } } //2. java8写法 public User getDefaultUser2(User user) { return Optional.ofNullable(user) .filter(u->"zhangsan2".equals(u.getName())) .orElseGet(()-> { User user1 = new User(); user1.setName("zhangsan2"); return user1; }); } @Data public static class User { String name; Address address; } @Data public static class Address { String city; } }
学海无涯 代码作伴