java8的几种常用用法
1. 如果接口的返回值有可能是null,请用Optional封装
|
public Optional<User> getUser() { return Optional.ofNullable(user); } return getUser().orElse(defaultUser); return getUser().map(u -> u.getOrders()).orElse(Collections.emptyList()); |
|---|
其他使用方法参考:http://unmi.cc/proper-ways-of-using-java8-optional/
好处:
- 优雅,下游不用写恶心的if-else判断
- 安全:告知接口的使用方返回值可能为null,需要处理,以避免代码缺陷
- 文档化:接口中可能为空的值文档化
2. 如果接口返回一个集合(list或set),可能一个Stream工厂是更好的选择
|
public Stream<UserBo> getUsers() { return userList.stream(); } public Stream<UserDto> getUsers(Stream<UserBo> users) { return users.map(UserDto::new); } public List<UserVo> getUsers(Stream<UserDto> users) { return users.map(UserVo::new).collect(toList()); } |
|---|
优点:
- 封装:很好地封装了内部实现的数据结构,仅暴露一个Stream接口,不用纠结返回Set还是List
- 缓求值:减少占用的存储空间,有利于运行时产生更高效率的代码(中间不用产生List<UserDto>对象了)
3. 使用Either取代抛出Exception
|
public Either<ErrorDtoException, UserDto> addUser(String userName) { if (exist(userName)) { return Either.left(new ErrorDtoException("username is exist")); } UserBo UserBo = saveUser(userName); return Either.right(new UserDto(userBo); } return addUser("myName").fold(e -> e.getMessage(), userDto -> userDto.getName()); |
|---|
更多Either的API可参考源码
优点:
- 消除副作用:抛出异常的行为本身就是一种副作用,会导致程序路径偏离正轨(进入异常的流程)。
- 优雅:在返回值里表明错误并作出响应,这样就不需要打断程序的一般流程了。
4. 如果接口会抛出非受检异常或下游不那么关注的异常,可使用Try封装
|
public Try<Integer> divide(Integer a, Integer b) { return Try.of(() -> a / b); } return divide(a, b).orElseMap(throwable -> defaultValue); |
|---|
更多Try的API可参考源码
优点和Either类似
https://github.com/javadeep/common-functional/blob/master/functional-lang/src/main/java/com/javadeep/functional/lang/control/retry/Retrys.java以及https://github.com/javadeep/common-functional/blob/master/functional-lang/src/main/java/com/javadeep/functional/lang/control/validator/FunctionalValidator.java中的实现均用到了Try数据结构,可深入体会下。
java8的几种常用用法的更多相关文章
- 关于function的一种常用用法
关于function的一种常用用法 void Share::InitAcrossManager() { GsMgrEvent gsMgrEvents;//保存function的结构体 gsMgrEve ...
- TL431的几种常用用法
TL431的主要作用是使得电路获得更稳定的电压,TL431是一种较为精密的可控稳压源,有着较为特殊的动态阻抗.其动态响应速度快,输出噪声低,价格低廉. 注意上述一句话概括,就是便宜,精密可控稳压源TL ...
- 【三支火把】---一份程序看懂C程序printf()的几种常用用法
闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...
- 【C_Language】---一份程序看懂C程序printf()的几种常用用法
闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...
- Swift3 substring几种常用用法
举例: " let length = str.characters.count //截取前四位 )) //截取后2位(两种方法) )) )) //截取中间4位,从第2位开始(二种方法) le ...
- 小谈python里 列表 的几种常用用法
在python中列表的常用方法主要包括增加,删除,查看和修改.下面以举例子的方法具体说明,首先我们创建两个列表,列表是用[ ]表示的,里面的元素用逗号隔开. a=[‘hello’,78,15.6,‘你 ...
- [转]jQuery的each方法的几种常用的用法
下面提一下jQuery的each方法的几种常用的用法 复制代码 代码如下: var arr = [ "one", "two", "three&quo ...
- Java必知必会的20种常用类库和API
转载:https://blog.csdn.net/u011001084/article/details/79216958 个人感觉工具类对日常开发是很重要的,所以推荐一下这篇文章,虽然有的类库过时了 ...
- centos的vi常用用法
centos的vi常用用法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...
随机推荐
- bzoj千题计划129:bzoj2007: [Noi2010]海拔
http://www.lydsy.com/JudgeOnline/problem.php?id=2007 1.所有点的高度一定在0~1之间, 如果有一个点的高度超过了1,那么必定会有人先上坡,再下坡, ...
- jubeeeeeat
http://cdqz.openjudge.cn/2016/0003/ 总时间限制: 1000ms 内存限制: 256000kB 描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏.这是个音乐游戏 ...
- OAuth2:Authorization Flows
Ref:http://www.dannysite.com/blog/176/ OAuth2.0协议定义了用于获得授权的四种主要授权类型. 1. Client Credentials 一种基于APP的密 ...
- 20155302 2016-2017-2 《Java程序设计》第七周学习总结
20155302 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 Lambda表达式的优点:更加紧凑的代码.修改方法的能力.更好地支持多核处理 "L ...
- c++刷题(9/100):链表
题目一:https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156&tP ...
- Oracle分析函数Over()
一.Over()分析函数 说明:聚合函数(如sum().max()等)可以计算基于组的某种聚合值,但是聚合函数对于某个组只能返回一行记录.若想对于某组返回多行记录,则需要使用分析函数. 1.rank( ...
- Scrapy爬虫框架之爬取校花网图片
Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设 ...
- Grunt、gulp、webpack、不要听着高大上你就上,试试Codekit?
下载地址:https://incident57.com/codekit/ 官方网站了解更多 要编译Less.Sass.Stylus, CoffeeScript, Typescript, Jade, H ...
- 项目中遇到的问题:Gradle传递性依赖冲突
问题描述: 在调用别人接口时,由于他们接口做了拦截处理在使用RestTemplate调用时必须要使用@Qualifier("他们封装好的类"),需要导入jar包 gradle方式导 ...
- 01 Getting Started 开始
Getting Started 开始 Install the Go tools Test your installation Uninstalling Go Getting help Downlo ...