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系统的 ...
随机推荐
- 动态改变swiper的属性
<script> var mySwiper = new Swiper('.swiper-container',{ autoplay : 1000, autoplayDisableOnInt ...
- don't run elasticsearch as root.
因为安全问题elasticsearch 不让用root用户直接运行,所以要创建新用户 第一步:liunx创建新用户 adduser XXX 然后给创建的用户加密码 passwd XXX ...
- 网络爬虫框架Heritrix中Modules的各项说明
1)Select Crawl Scope:Crawl Scope 用于配置当前应该在什么范围内抓取网页链接.例如选择 BroadScope 则表示当前的抓取范围不受限制,选择 HostScope 则表 ...
- sklearn进行拟合
# codind:utf-8 from sklearn.linear_model import SGDRegressor,LinearRegression,Ridge from sklearn.pre ...
- VC++的全局变量(转)
全局变量一般这样定义:1.在一类的.cpp中定义 int myInt;然后再在要用到的地方的.cpp里extern int myInt:这样就可以用了. 2.在stdafx.cpp中加入:int my ...
- 南京邮电大学CTF密码学部分Writeup
异性相吸 1.xor 2.hex2binary 3.len(bin(miwen))==len(bin(mingwen)) # -*- coding:utf-8 -*- file_de = open(' ...
- 冲量:momentum
参见:http://www.jianshu.com/p/58b3fe300ecb,这个博客里有冲量的python实现的代码和讲解 “冲量”这个概念源自于物理中的力学,表示力对时间的积累效应. 在普通的 ...
- 使用ubifs格式的根文件系统
配置内核,使其支持ubifs文件系统 1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Uns ...
- vs2012 连接oracle11g 及数据的insert及select 的总结
下载链接Oracle 11g所需的驱动ODTwithODAC1120320_32bit,下载链接为http://www.oracle.com/technetwork/topics/dotnet/uti ...
- redhat6.5文件共享
以下操作均需要root用户 a端: 固定nfs端口 #vi /etc/sysconfig/nfs 将里面的RQUOTAD_PORT.LOCKD_TCPPORT.LOCKD_UDPPORT.MOUNTD ...