java 8 Optional 解决NullPointerException

在Java8中,引入了一个新的类java.util.Optional ,这个Optional专门用来解决空引用的问题。对于一个方法的返回值什么的,都不需要再判断是不是null了。

package com.ven.java8.Optional;

import java.util.Optional;

/**
 * 解析Optional
 * 
 * @author xiaowen
 *
 */
public class TestOptional {
	public static void main(String[] args) {
		// 创建一个对象
		SysUser sysUser = new SysUser("xiaowen", "男");
		String role = "JAVA IT";
		// ***************创建Optional部分 start*******
		// 使用of方法创建Optional
		Optional<SysUser> optional = Optional.of(sysUser);
		Optional<String> optional3 = Optional.of(role);
		// Optional<SysUser> optional2 =
		// Optional.of(null);//如果传入的参数为null就会出现异常java.lang.NullPointerException

		// ofNullable(T)可有任意对象创建对象
		// Optional<SysUser> optional3 = Optional.ofNullable(null);

		// empty()返回一个空的Optional
		// Optional<SysUser> optional4 = Optional.empty();

		// ************************创建Optional部分 end******

		// ***********************Optional方法的使用******

		// get(),获取Optional中的对象
		SysUser sysUser2 = optional.get();
		System.out.println("对象:" + sysUser2);
		// isPresent()判断当前对象是否存在
		boolean present = optional.isPresent();// 类似 if(value!=null)
		if (present) {
			System.out.println("大家好!我是" + sysUser.getName() + "我是一个可爱的boy!");
		} else {
			new Throwable("出现异常,当前对象为null!");
		}

		// filter方法,
		// 条件判断Optional里面的对象是否满足某一个条件
		// 类似 if(value!=null&&value.contains("xiaowen"))
		// 源码 接收一个断言接口Predicate参数对象,Predicate
		/*
		 * public Optional<T> filter(Predicate<? super T> predicate) {
		 * Objects.requireNonNull(predicate); if (!isPresent()) return this;
		 * else return predicate.test(value) ? this : empty(); }
		 */
		// optional.filter(x -> x.contains("ab")).ifPresent(x::print);

		if (optional.isPresent() && optional.get().getName().equals("xiaowen")) {
			System.err.print(optional.get().getName() + "_" + optional.get().getSex());
		} else {
			System.err.println("该对象不存在该属性!");
		}

		// map方法 可以对optional里面的对象的值做处理
		// 类似于
		// if(value!=null){
		// String name = name.toLowerCase();
		// if(name.length() >1){
		// System.out.println(name);
		// }
		// }
		// 转换变量
		Optional<String> filter = optional3.map(String::toLowerCase).filter(result -> result.length() > 1);
		System.out.print("转换过后的变量:" + filter.get());

		// orElse 当Optional里的数据为null,想返回一些默认值
		// 类似
		// int defaultValue = (x!=null)?x:-1;
		String orElse = optional3.orElse("NON");
		System.out.println(orElse);

		// orElseThrow 值不存在 抛出异常
		// 类似
		// if (s != null && !s.isEmpty())
		// return s;
		// else
		// throw new IllegalArgumentException();
		// }
		optional3.filter(s -> !s.isEmpty()).map(s -> s.charAt(0)).orElseThrow(IllegalArgumentException::new);

		// 如果SysUser对象里面有一个Address对象,Address里面有addressName属性,这系都有可能为null,在
		// java8之前的版本判断是否为null的情况
		/*
		 * public boolean judge(){ if(sysUser!=null){
		 * if(sysUser.getAddress()!=null){
		 * if(sysUser.getAddress().getAddressName()!=null){ return true; } }
		 * 
		 * } return false; }
		 */
		// 当然也这样判断非空
		// return 
		// sysUser!=null&&sysUser.getAddress()!=null&&sysUser.getAddress().getAddressName()!=null;

    	//Optional转换为List
	/*	public static <T> List <T> toList(Optional<T> optional){
			return optional.map(Collections::singletonList).orElse(Collections.emptyList());
		}*/
	
	
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值