java user构建方法,Java8 Optional的详细使用教程

optional介绍

optional是jdk1.8提供的一个新类,希望可以通过该类的引入解决令人烦躁的null判断问题,非常好用。个人理解:这个类是一个包装类,将要操作的java bean封装到该类的对象里面,同时将一些常用的判断逻辑封装为成员方法,结合lambda语法,实现比较优雅的链式调用。现在对optional的api使用做一个简单的说明。

api介绍

optional的所有的方法如下图所示,这些api大致可以分为以下几类:

1、构建api:构建一个optional对象;方法有:empty( )、of( )、ofnullable( );

2、获取api:获取optional对象里包装的值;方法有:get( )、orelse( )、orelseget( )、orelsethrow( );

3、转换api:将optional对象里包装的值转换成一个新的值;方法有:map( )、flatmap( );

4、判断api:对optional对象里包装的值做一些逻辑判断;方法有:filter( )、ispresent( )、ifpresent( );

67e083b23631cd770029aa97b0a5af26.png

api使用方法

首先准备一个pojo类

@data

@noargsconstructor

@allargsconstructor

@equalsandhashcode

@tostring

public class userinfo {

private string username;

private string password;

private integer age;

private string gender;

}

构建类

@test

public void testbuildoptional() {

// 构建一个value为null的optional对象;

optional userinfoemptyopt = optional.empty();

// 构建一个value不可以为null的optional对象,如果of()的入参为null会报空指针异常;

optional userinfoopt = optional.of(new userinfo("阿飞","123456", 15, "man"));

// 构建一个value可以为null的optional对象;

optional userinfonullopt = optional.ofnullable(null);

system.out.println(userinfoemptyopt);

system.out.println(userinfoopt);

system.out.println(userinfonullopt);

// 输出如下:

// optional.empty

// optional[userinfo(username=阿飞, password=123456, age=15, gender=man)]

// optional.empty

}

获取类

@test

public void testgetoptionalvalue() {

optional userinfoemptyopt = optional.empty();

optional userinfoopt = optional.of(new userinfo("阿飞","123456", 15, "man"));

// 直接获取,注意如果value==null,会报nosuchelementexception异常

userinfo userinfo1 = userinfoopt.get();

// orelse可以传入一个userinfo类型的对象作为默认值;当value!=null时,返回value值;当value==null时,返回默认值作为代替;

userinfo userinfo2 = userinfoemptyopt.orelse(new userinfo("阿飞1","123456", 15, "man"));

// orelseget和orelse不同的是orelseget可以传入一段lambda表达式;当value!=null时,返回value值;当value==null时,使用该lambda返回的对象作为默认值;

userinfo userinfo3 = userinfoemptyopt.orelseget(() -> new userinfo("阿飞2","123456", 15, "man"));

// orelsethrow可以传入一段lambda表达式,lambda返回一个exception;当value!=null时,返回value值;当value==null时,抛出该异常;

userinfo userinfo4 = userinfoopt.orelsethrow(nullpointerexception::new);

system.out.println(userinfo1);

system.out.println(userinfo2);

system.out.println(userinfo3);

system.out.println(userinfo4);

// 输出如下:

// userinfo(username=阿飞, password=123456, age=15, gender=man)

// userinfo(username=阿飞1, password=123456, age=15, gender=man)

// userinfo(username=阿飞2, password=123456, age=15, gender=man)

// userinfo(username=阿飞, password=123456, age=15, gender=man)

}

转换类

@test

public void testmapoptionalvalue() {

optional userinfoopt = optional.of(new userinfo("阿飞","123456", 15, "man"));

// 原来value的类型是userinfo,经过map转换为optional

optional username = userinfoopt.map(userinfo::getusername);

// 当map的入参也是一个optional时,经过map转化后会形成optional>这种嵌套结构;但flatmap可以把这种嵌套结构打平;

optional> unflatmap = userinfoopt.map(user -> optional.of(user.getusername()));

optional flatmap = userinfoopt.flatmap(user -> optional.of(user.getusername()));

system.out.println(username);

system.out.println(unflatmap);

system.out.println(flatmap);

// 输出如下:

// optional[阿飞]

// optional[optional[阿飞]]

// optional[阿飞]

}

判断类

@test

public void testjudgeoptionalvalue() {

optional userinfoemptyopt = optional.empty();

optional userinfoopt = optional.of(new userinfo("阿飞", "123456", 15, "man"));

// filter传入一个lambda,lambda返回值为boolean;true:不做任何改变,false:返回一个空的optional;

optional userinfo = userinfoopt.filter(user -> "错误的密码".equals(user.getpassword()));

system.out.println(userinfo);

// ispresent就是判断value是不是null;我们在调用get之前,一定要先调用ispresent,因为直接如果value是null,直接调用get会报异常;

if (userinfoemptyopt.ispresent()) {

userinfo value = userinfoemptyopt.get();

system.out.println("optional value:" + value);

} else {

system.out.println("optional value==null");

}

// ifpresent传入一段lambda,当value!=null时,执行里面的逻辑;当当value==null时,啥都不干;

userinfoopt.ifpresent(value -> system.out.println("optional value:" + value));

// 输入如下:

// optional.empty

// optional value==null

// optional value:userinfo(username=阿飞, password=123456, age=15, gender=man)

}

试一下这些api吧

package com.fly.optional;

import lombok.allargsconstructor;

import lombok.data;

import lombok.noargsconstructor;

import lombok.tostring;

import org.junit.test;

import org.omg.cosnaming.namingcontextpackage.notfound;

import java.math.bigdecimal;

import java.util.optional;

public class optiondemo {

@data

@noargsconstructor

@allargsconstructor

@tostring

static class employee {

private long id;

private string name;

private boolean leader;

}

@data

@noargsconstructor

@allargsconstructor

@tostring

static class leader {

private long employeeid;

private bigdecimal bonus;

}

/**

* 找到id为1的员工,如果有奖金就打印出来,没有就打印没有奖金;

* @throws notfound

*/

@test

public void tst() throws notfound {

optional leader = optional.ofnullable(getemployeebyid(1l).filter(employee::getleader).map(employee::getid).flatmap(this::getleaderbyemployeeid).orelse(null));

if (leader.ispresent()) {

optional.of(leader.map(leader::getbonus).map(bonus -> string.format("员工id为1的leader奖金为:%s", bonus)).orelse("员工id为1的leader也没有奖金")).ifpresent(system.out::println);

} else {

system.out.println("员工id为1的leader未找到,他可能只是一个基层员工,不配拥有奖金");

}

}

private optional getemployeebyid(long id) {

//return optional.of(new employee(1l, "大老板", boolean.true));

return optional.of(new employee(1l, "大老板", boolean.false));

}

private optional getleaderbyemployeeid(long employeeid) {

//return employeeid == 1l ? optional.of(new leader(1l, bigdecimal.valueof(1000000000))) : optional.empty();

return employeeid == 1l ? optional.of(new leader(1l, null)) : optional.empty();

}

}

总结

到此这篇关于java8 optional的详细使用的文章就介绍到这了,更多相关java8 optional使用内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值