登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
Gitee AI
NEW
我知道了
查看详情
登录
注册
代码拉取完成,页面将自动刷新
开源项目
>
程序开发
>
常用工具包
&&
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3.9K
Star
23.3K
Fork
8K
GVP
dromara
/
hutool
代码
Issues
5
Pull Requests
1
统计
流水线
服务
Gitee Pages
JavaDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
我知道了,不再自动展开
Pull Requests
/
详情
426
关于即将被废弃的OptionalBean,改为Opt
已合并
阿超:v5-dev
dromara:v5-dev
阿超
创建于 2021-10-01 00:33
克隆/下载
HTTPS
SSH
复制
下载 Email Patch
下载 Diff 文件
#### 说明 - 老实话,`Optional`一直是我非常常用的一个类,使用函数式编程,将原本多行代码,缩略成一行,极大简洁了代码 - 但在经常使用中,发现有时候原生的`Optional`并不能完全满足我的需求,在`Hutool`中找,发现确实有一个`OptionalBean`,但其已经被废弃了,因此才有了这个类 - 通过对`JDK16`的学习,研究了`Optional`的新特性,并已经在开发中经常使用基于`Optional`复制后拓展的类 - 讲老实话,经常使用`Stream`,有些方法的返回值为`Optional`,我本是想直接在`Optional`进行继承并拓展,无奈它是一个`final`类 - 我想,就这样眼睁睁看着`Hutool`中的`OptionalBean`被废弃,不如让它梅开二度,在`Hutool`的新版本迎来第二春! ### 修改描述(包括说明bug修复或者添加新特性) 1. [bug修复] balabala…… 2. [新特性] - 对原生Optional的使用区别不大,学习成本低 - 注释全都汉化并带理解(累瘫) - 相比与Optional的新特性都包含在测试用例中 - ofBlankAble函数基于ofNullable的逻辑下,额外进行了空字符串判断 ``` // ofBlankAble相对于ofNullable考虑了字符串为空串的情况 String hutool = OptionalBean.ofBlankAble("").orElse("hutool"); Assert.assertEquals("hutool", hutool); ``` - 原版Optional有区别的是,get不会抛出NoSuchElementException - 如果想使用原版Optional中的get这样,获取一个一定不为空的值,则应该使用orElseThrow ``` // 和原版Optional有区别的是,get不会抛出NoSuchElementException // 如果想使用原版Optional中的get这样,获取一个一定不为空的值,则应该使用orElseThrow Object opt = OptionalBean.ofNullable(null).get(); Assert.assertNull(opt); ``` - 将jdk11 Optional中的新函数isEmpty,直接照搬了过来 ``` // 这是jdk11 Optional中的新函数,直接照搬了过来 // 判断包裹内元素是否为空,注意并没有判断空字符串的情况 boolean isEmpty = OptionalBean.empty().isEmpty(); Assert.assertTrue(isEmpty); ``` - 将jdk9 Optional中的新函数ifPresentOrElse,直接照搬了过来 ``` // 这是jdk9中的新函数,直接照搬了过来 // 存在就打印对应的值,不存在则用{@code System.err.println}打印另一句字符串 OptionalBean.ofNullable("Hello Hutool!").ifPresentOrElse(System.out::println, () -> System.err.println("Ops!Something is wrong!")); OptionalBean.empty().ifPresentOrElse(System.out::println, () -> System.err.println("Ops!Something is wrong!")); ``` - 新增了peek函数,相当于ifPresent的链式调用(个人常用) ``` User user = new User(); // 相当于ifPresent的链式调用 OptionalBean.ofNullable("hutool").peek(user::setUsername).peek(user::setNickname); Assert.assertEquals("hutool", user.getNickname()); Assert.assertEquals("hutool", user.getUsername()); // 注意,传入的lambda中,对包裹内的元素执行赋值操作并不会影响到原来的元素 String name = OptionalBean.ofNullable("hutool").peek(username -> username = "123").peek(username -> username = "456").get(); Assert.assertEquals("hutool", name); ``` - 将jdk9 Optional中的新函数or,直接照搬了过来 ``` // 这是jdk9 Optional中的新函数,直接照搬了过来 // 给一个替代的Opt String str = OptionalBean.<String>ofNullable(null).or(() -> OptionalBean.ofNullable("Hello hutool!")).map(String::toUpperCase).orElseThrow(); Assert.assertEquals("HELLO HUTOOL!", str); User user = User.builder().username("hutool").build(); OptionalBean<User> userOptionalBean = OptionalBean.of(user); // 获取昵称,获取不到则获取用户名 String name = userOptionalBean.map(User::getNickname).or(() -> userOptionalBean.map(User::getUsername)).get(); Assert.assertEquals("hutool", name); ``` - 对orElseThrow进行了重载,支持 双冒号+自定义提示语 写法,比原来的 ``` orElseThrow(() -> new IllegalStateException("Ops!Something is wrong!")) ``` 更加优雅,修改后写法为: ``` orElseThrow(IllegalStateException::new, "Ops!Something is wrong!") ``` 测试用例: ``` // 获取一个不可能为空的值,否则抛出NoSuchElementException异常 Object obj = OptionalBean.ofNullable(null).orElseThrow(); // 获取一个不可能为空的值,否则抛出自定义异常 Object assignException = OptionalBean.ofNullable(null).orElseThrow(IllegalStateException::new); // 获取一个不可能为空的值,否则抛出带自定义消息的自定义异常 Object exceptionWithMessage = OptionalBean.empty().orElseThrow(IllegalStateException::new, "Ops!Something is wrong!"); ```
怎样手动合并此 Pull Request
git checkout v5-dev
git pull https://gitee.com/VampireAchao/hutool.git v5-dev
git push origin v5-dev
评论
6
提交
1
文件
2
检查
代码问题
0
展开设置
折叠设置
审查
审查人员
phhzb
phhutool
阿超
VampireAchao
lxSkye
lxSkye
Husky
Husky_jzq
CherryRum
henan_is_unique_oldletter
dazer007
dazer007
Createsequence
CreateSequence
emptypoint
emptypoint
爱花花
huahua522
handy
handy-git
liumengwei
lmwffdbb
Looly
loolly_admin
未设置
最少人数
0
Code Owner
测试
phhzb
phhutool
阿超
VampireAchao
lxSkye
lxSkye
Husky
Husky_jzq
CherryRum
henan_is_unique_oldletter
dazer007
dazer007
Createsequence
CreateSequence
emptypoint
emptypoint
爱花花
huahua522
handy
handy-git
liumengwei
lmwffdbb
Looly
loolly_admin
未设置
最少人数
0
优先级
不指定
严重
主要
次要
不重要
标签
标签管理
enhancement
关联 Issue
未关联
Pull Request 合并后将关闭上述关联 Issue
里程碑
未关联里程碑
参与者
(3)
Cherry Pick
选择 Cherry-Pick 代码的目标仓库
dromara/hutool
选择要提交 PR 的目标仓库和分支
dromara/hutool
v5-dev
提交模式
Fast forward
non-Fast forward
提交列表
Commit SHA
Commit Message
Cherry-pick Commit Message
*
取消
Cherry-pick
Java
1
https://gitee.com/dromara/hutool.git
git@gitee.com:dromara/hutool.git
dromara
hutool
hutool
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册