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系统的 ...
随机推荐
- highCharts参数实例解释
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Jupyter Notebook Tutorial: Introduction, Setup, and Walkthrough
Jupyter Notebook Tutorial: Introduction, Setup, and Walkthrough YouTube https://www.youtube.com/watc ...
- TED_Topic6:How to raise a black son in America
By Clint Smith As kids, we all get advice from parents and teachers that seems strange, even confusi ...
- HDU1693 Eat the Trees(zerojudge a228)
传送门: https://zerojudge.tw/ShowProblem?problemid=a228 http://acm.hdu.edu.cn/showproblem.php?pid=1693 ...
- 20155310 2016-2017-2 《Java程序设计》第六周学习总结
20155310 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 4.1 Y86指令集体系结构 •有8个程序寄存器:%eax.%ecx.%edx.%ebx.% ...
- 【leetcode 简单】 第一百一十二题 重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" 输出: True 解释 ...
- python概念-各类绑定的概念和property的变态一面
# 编辑者:闫龙 # 1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性 #在类中定义的(self)方法都是绑定到对象的方法 #定义 class a: def b(self):#绑定到 ...
- 《区块链100问》第81集:应用类项目Augur
Augur是基于以太坊区块链打造的去中心化预测平台,于2015年6月正式发布,是以太坊上的第一款应用. Augur采用了一个叫“群体智慧”的概念,它的意思是,一群人的智慧会高于这群人中最聪明的人.所以 ...
- Linux USB驱动学习总结(一)---- USB基本概念及驱动架构
USB,Universal Serial Bus(通用串行总线),是一个外部总线标准,用于规范电脑与外部设备的连接和通讯.是应用在PC领域的接口技术.USB接口支持设备的即插即用和热插拔功能.USB是 ...
- Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux【转】
转自:http://www.cnblogs.com/LittleHann/p/4127096.html 目录 1. sys_call_table:系统调用表 2. 内核符号导出表:Kernel-Sym ...