java optional详解_详解Java8 Optional类{最全}

1:Optional

1.1 概述

Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException),提供了一些的方法代替过去的if-else处理逻辑,并与Stream流结合提供一致性的函数式编程.

注意: Optional 不支持Java本身提供的序列化与反序列化机制,也就是RPC不能使用Java提供的序列化机制

1.2 方法概览

页面 看不清,请下载或者另一个页面打开即可看清楚

4996a6710de3ef22e58e6c2860847a6f.png

2: 常用方法

2.1 构造方法

需要提前检查NPE 使用of方法

不管情况直接构造 使用ofNULLable*()方法

empty() 方法 前面方法间接使用了这个方法

@Test(expected = NoSuchElementException.class)public voidwhenCreateEmptyOptional_thenNull() {

Optional emptyOpt =Optional.empty();

emptyOpt.get();//没有值 将会抛出异常

}

@Test(expected= NullPointerException.class)public voidtest_of() {

User user=null;

Optional optional =Optional.of(user);

}

@Testpublic voidtest_ofNuLLAble() {

User user=null;

Optional optional =Optional.ofNullable(user);

optional.orElse(newUser());//一般不使用 optional.get();

}

2.2 取得值

get方法取不到值将会抛出异常NPE

orElse系列方法,在null值的情况 将会提供默认值

//取得值

@Testpublic voidtest_getValue() {

Optional opt = Optional.ofNullable(null);

String str=opt.get();

String str2= opt.orElse("Tom");

Assert.assertEquals("Tom", str2);

String str3= opt.orElseGet(()->"Tom2");

Assert.assertEquals("Tom2", str3);

}

2.3 检查处理

//检查处理

@Testpublic voidtest_Check() {

Optional opt = Optional.ofNullable(null);

Assert.assertTrue(opt.isEmpty());

Assert.assertFalse(opt.isPresent());//not null

if(opt.isPresent()) {

String string=opt.get().toUpperCase();

}

opt.ifPresent(x->x.toUpperCase()); //解决了if 问题 代码简洁//内部是runable 不能返回值 所以值这个方法功能有限 但是可以执行一些耗时操作

opt.ifPresentOrElse(x->x.toUpperCase(),()->System.out.println("sss"));

}

2.4 返回值

@Testpublic voidtest_returnValue() {

Optional opt = Optional.ofNullable(null);

Assert.assertEquals("Cat", opt.orElse("Cat"));

Assert.assertEquals("Cat", opt.orElseGet(()->"Cat"));//or 为jdk9 新方法

String str_tom = opt.or(()->Optional.of("Tom")).get();

Assert.assertEquals("Tom", str_tom);

}

2.5 返回异常

@Test(expected = NoSuchElementException.class)public voidtest_return_Exception() {

Optional opt = Optional.ofNullable(null);

Assert.assertEquals("Cat", opt.orElseThrow());

Assert.assertEquals("Cat", opt.orElseThrow(()->newNoSuchElementException()));

}

2.6 转换 与过滤

@Testpublic voidtest_MapAndFilter() {

String [] str= new String[] {"a","b","c","d","1"};

Optional opt =Optional.ofNullable(str);//filter

String[] res = opt.filter(x->{for(String s : x) {if(s.contains("e")) {return false;

}

}return true;

}).get();

System.out.println(Arrays.toString(res));//map 转大小

List list=new ArrayList<>();for(String x:str) {list.add(x);};

Optional map = Optional.ofNullable(list).map(x->x.iterator().next().toUpperCase());

List list2 =Optional.ofNullable(list).stream().

flatMap(x->x.stream().map(y->y.toUpperCase())).collect(Collectors.toList());

System.out.println(list2);

}

2.7 链式操作

支持链式操作,序列化滞后

@Testpublic voidTest_ChainCollec() {

Street street= new Street("武汉轻工大学", 5);

Address address= newAddress(street);

Person person= new Person("Tom", 12,address );

String string=Optional.ofNullable(person).

flatMap(u->u.getAddress())

.flatMap(p->p.getStreet())

.map(l->l.getStreetName())

.orElse("default");

System.out.println(string);

Address address2= new Address(null);

Person person2= new Person("Tom", 12,null);

String s3= Optional.ofNullable(person2).flatMap(u->u.getAddress())

.orElse(new Address(null))

.getStreet()

.orElse(new Street("武汉大学", 1))

.getStreetName();

System.out.println(s3);

ByteArrayOutputStream bos= newByteArrayOutputStream();

ObjectOutputStream obr;try{

obr= newObjectOutputStream(bos);

obr.writeObject(person);

}catch(IOException e) {

e.printStackTrace();

}

ByteArrayInputStream inputStream= newByteArrayInputStream(bos.toByteArray());try{

ObjectInputStream inputStream2= newObjectInputStream(inputStream);

Person person23=(Person) inputStream2.readObject();

System.out.println(person23.getAddress().get().getStreet().get().getStreetName());

}catch(IOException e) {

e.printStackTrace();

}catch(ClassNotFoundException e) {

e.printStackTrace();

}

}

其他代码

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

class Person implementsSerializable{privateString name;privateInteger age;privateAddress address;publicPerson(String name, Integer age, Address address) {this.name =name;this.age =age;this.address =address;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicInteger getAge() {returnage;

}public voidsetAge(Integer age) {this.age =age;

}public Optional

getAddress() {return Optional.ofNullable(this.address);

}public voidsetAddress(Address address) {this.address =address;

}

}class Address implementsSerializable{privateStreet street ;public OptionalgetStreet() {return Optional.ofNullable(this.street);

}public voidsetStreet(Street street) {this.street =street;

}publicAddress(Street street) {super();this.street =street;

}

}class Street implementsSerializable{privateString streetName ;privateInteger streetNo;publicStreet(String streetName, Integer streetNo) {this.streetName =streetName;this.streetNo =streetNo;

}publicString getStreetName() {returnstreetName;

}public voidsetStreetName(String streetName) {this.streetName =streetName;

}publicInteger getStreetNo() {returnstreetNo;

}public voidsetStreetNo(Integer streetNo) {this.streetNo =streetNo;

}

}

View Code

68f724bad5a33d9a9f6bd2ca7369ecb7.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值