最近在一些国外的技术博客中见到一个以前自己没太见过的编程风格,那就是Either,觉得非常有意思,稍微了解了下。分享给大家。

同时,我会基于最流行的后端语言Java来简单的演示下如何使用Either。

什么是Either

在英语中,Either是的意思,这也是函数式编程风格中Either的意思。

Either是一个对象,它代表两有两种可能,或是left,或是right。通常left表示错误或异常,而right代表成功

一个典型的Either代码是这样的(基于Java)

//保存一个用户,返回Either,有两种可能,或是UserError出现某种错误,或是User表示保存成功
public Either<UserErrorCode,User> createLocalUser();

这个写法是不是某种程度上,是不是可以替换了Java原来的异常及try…catch?

挺有意思的。

一个简单的实例

不使用Either的做法

    public User createLocalUser(){if(Strings.isNullOrEmpty(name))throw new UserNameEmptyException();if(Strings.isNullOrEmpty(password))throw new PasswordEmptyException();if(Strings.isNullOrEmpty(userId))throw new UserIdEmptyException();this.created = System.currentTimeMillis();this.encodePassword = getPasswordEncoder().encodePassword(password);return getUserRepository().save(this);}

用Either重写上述方法

    public Either<UserErrorCode,User> createLocalUser(){if(Strings.isNullOrEmpty(name)) return Either.left(UserErrorCode.USER_NAME_EMPTY);if(Strings.isNullOrEmpty(password))return Either.left(UserErrorCode.PASSWORD_EMPTY);if(Strings.isNullOrEmpty(userId))return Either.left(UserErrorCode.USER_ID_EMPTY);this.created = System.currentTimeMillis();this.encodePassword = getPasswordEncoder().encodePassword(password);var created =  getUserRepository().save(this);return Either.right(created);}

有什么好处?

避免抛出异常带来的不可预知性

我们都知道,在Java中,处理类似场景我们大多会使用异常,但抛出异常会使方法返回变得不可预测,就是你不确定这个方法究竟是成功了还是抛出异常了。

所以,我们得在代码中,使用try…catch来捕获或处理成功或失败的不同场景。

但是如果使用Either返回,具意味着方法返回的是一个可以确定的Either对象。

这样本身代码会简洁很多,也会减少处理不同场景的代码复杂度。

保持函数式风格的优雅

相信大家都使用过Java 8之后的Stream等一些函数式风格,这会让你的代码更简洁与优雅。而有了Either之后,这意味着你可以保持这种简洁与优雅。

示例如下:

computeWithEither(9).left().map(FetchError::getMsg).forEach(System.out::println);

Either中有简洁的left以及right方法,通过这些方法结合流,这样处理业务时,比try…catch是不是优雅很多?

Either来源于何处?

我不是非常确认,但从我搜索的资料来看,似乎Scala语言中自带了这个特性,考虑到Scala比Java更具有函数式编程的能力,也许Either是从Scala中发展而来

Java中如何使用Either?

Java有一个非常好的函数式风格的类库https://www.vavr.io/,里面就包含了Either这个小功能。

vavr还有其它许多对JDK的函数式风格的补充,如果你喜欢函数式编程风格,我想也许你不会想错过它。

编程小TIPS:使用函数式风格Either来编程相关推荐

  1. 25个实用编程小技巧

    点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 如果每个程序开发人员都只是周而复始地写代码,想必编程的工 ...

  2. python函数的作用降低编程复杂度_Python函数式编程

    lambda 本文将介绍Python中函数式编程的特性.在对函数式编程的概念有了了解后,本文会介绍iterators和generators等语言特性,还有itertools和functools等相关的 ...

  3. 《.NET并发编程实战》之 函数式并发基础

    本书是一本划时代的著作!在以下领域具有非常深远的意义: .NET 开发领域--本书再次将.NET 开发人员进行了分层隔代. 高性能/多核/并发编程领域--本书让锁从此变成过去时. 程序员职业生涯领域- ...

  4. 001 spring5框架:java类工程,IOC:实体类表示表关系,AOP,JdbcTemplate模板,事务操作,Spring5 框架新功能:日志,为空注解,函数式风格,juint,Webflux

    1. Spring5 框架(Spring5 Framework)介绍 1.1 概念 1.Spring 是轻量级的开源的 JavaEE 框架 2.Spring 可以解决企业应用开发的复杂性 3.Spri ...

  5. scala入门之识别函数式风格

    为什么80%的码农都做不了架构师?>>>    scala允许指令式的编程风格,但是鼓励采用函数式的风格.如果你是从指令式的背景转到scala来的-----例如,如果你是Java程序 ...

  6. 值得玩味儿的14个Python编程小技巧

    全文共394个字,1张图,预计阅读时间5分钟. 最近的工作中经常使用Python编写一些基本解决一些NLP的小问题,在自己的工作日记里面也记录了不少的python编程中常用的小"Trick& ...

  7. 小tips:JS之浅拷贝与深拷贝

    浅拷贝: function extendCopy(p) {var c = {};for (var i in p) {c[i] = p[i];}return c; } 深拷贝: function dee ...

  8. AI之Tool:GitHub Copilot(一款人工智能编程小助手—猜你想写的代码)的简介、安装、使用方法之详细攻略

    AI之Tool:GitHub Copilot(一款人工智能编程小助手-猜你想写的代码)的简介.安装.使用方法之详细攻略 目录 Copilot人工智能工具的简介 1.GitHub Copilot的安全性 ...

  9. fp函数式编程_全面了解函数式编程(FP)

    fp函数式编程 This is the other major programming paradigm. If you are interested in Objected oriented pro ...

最新文章

  1. PHP学习笔记-PHP语言基础2
  2. elementUi、iview、ant Design源码button结构篇
  3. JetBrains PyCharm选中内容后Backspace删除无法使用,Ctrl+c/Ctrl+v/Ctrl+s/Ctrl+d等等快捷键无法使用的问题的解决
  4. python 选择题 多线程_python多线程练习题
  5. miniusbpcb封装_MINI MICRO A型B型D型USB多类型Altium AD元件库 PCB封装库的电路方案详解...
  6. java redis hscan_如何在Redis中使用HSCAN命令?
  7. Linux C代码获取天气情况
  8. Github Gitee Java开发 热门中后台开源项目
  9. numpy转str python_python-numpy数组上的str()方法并返回
  10. 莫斯科的年轻人(一)
  11. python写excel宏_使用python执行excel的VBA(宏)
  12. cesium 模型实体平移
  13. 群晖NAS配置DNSPodDDNS实现外网访问(仅适用于阿里云域名)
  14. 关于烧饼游戏修改器的分析
  15. 与 vmx86 驱动程序的版本不匹配解决方法
  16. mysql常用汉字库_MYSQL 常用总结【基础】
  17. 检测手机号码是否合法(正则表达式)
  18. 敢死队就像看焰火表演
  19. 各种本地存储对比 cookie,localStorage,sessionStorage,indexDB以及他们和vuex的区别
  20. iOS——KVO与KCO

热门文章

  1. Windows7下pip安装包报错 Microsoft Visual C++ 9 0 is required Unabl
  2. HBuilderX 详细安装教程
  3. whaleCTF-30days-隐写【第二期】-彩虹糖-writeup
  4. opencv中批量读取图片并保存
  5. 能耗监测系统是干嘛的?
  6. Android_应用程序权限
  7. 一级建造师考试报名需要的材料,点击收藏!
  8. 怎么获取计算机用户权限,W7电脑系统怎么获取administrator权限
  9. GR节点故障The member contains transactions not present in the group
  10. php百度大脑,百度大脑和图灵机器人制作一个简单的自动聊天机器人【PHP代码】...