当前位置: 首页 > news >正文

上海高品质网站建设/搜索引擎排名优化价格

上海高品质网站建设,搜索引擎排名优化价格,做跨境电商在什么网站选品,网站建设玖金手指花总JDK 提供三个静态方法来构造一个 Optional: 1.Optional.of(T value),该方法通过一个非 null 的 value 来构造一个 Optional,返回的 Optional 包含了 value 这个值。对于该方法,传入的参数一定不能为 null,否则便会抛出…

JDK 提供三个静态方法来构造一个 Optional
1.Optional.of(T value),该方法通过一个非 null 的 value 来构造一个 Optional,返回的 Optional 包含了 value 这个值。对于该方法,传入的参数一定不能为 null,否则便会抛出 NullPointerException

2.Optional.ofNullable(T value),该方法和 of 方法的区别在于,传入的参数可以为 null —— 但是前面 javadoc 不是说 Optional 只能包含非 null 值吗?我们可以看看 ofNullable 方法的源码:

 

原来该方法会判断传入的参数是否为 null,如果为 null 的话,返回的就是 Optional.empty()

3.Optional.empty(),该方法用来构造一个空的 Optional,即该 Optional 中不包含值 —— 其实底层实现还是 如果Optional 中的 value 为 null 则该 Optional 为不包含值的状态,然后在 API 层面将 Optional 表现的不能包含 null值,使得 Optional 只存在 包含值 和 不包含值 两种状态。

 


前面 javadoc 也有提到,Optional 的 isPresent() 方法用来判断是否包含值,get() 用来获取 Optional 包含的值 —— 值得注意的是,如果值不存在,即在一个Optional.empty 上调用 get() 方法的话,将会抛出 NoSuchElementException 异常。
我们假设 getUserById 已经是个客观存在的不能改变的方法,那么利用 isPresent 和 get 两个方法,我们现在能写出下面的代码:

 
  1. Optional<User> user = Optional.ofNullable(getUserById(id));

  2. if (user.isPresent()) {

  3. String username = user.get().getUsername();

  4. System.out.println("Username is: " + username); // 使用 username

  5. }

好像看着代码是优美了点 —— 但是事实上这与之前判断 null 值的代码没有本质的区别,反而用 Optional 去封装 value,增加了代码量。所以我们来看看 Optional 还提供了哪些方法,让我们更好的(以正确的姿势)使用 Optional

1.ifPresent

 

如果 Optional 中有值,则对该值调用 consumer.accept,否则什么也不做。
所以对于上面的例子,我们可以修改为:

 
  1. Optional<User> user = Optional.ofNullable(getUserById(id));

  2. user.ifPresent(u -> System.out.println("Username is: " + u.getUsername()));

2.orElse

 

如果 Optional 中有值则将其返回,否则返回 orElse 方法传入的参数。

 
  1. User user = Optional

  2. .ofNullable(getUserById(id))

  3. .orElse(new User(0, "Unknown"));

  4.  
  5. System.out.println("Username is: " + user.getUsername());

3.orElseGet

 

orElseGet 与 orElse 方法的区别在于,orElseGet 方法传入的参数为一个 Supplier 接口的实现 —— 当 Optional中有值的时候,返回值;当 Optional 中没有值的时候,返回从该 Supplier 获得的值。

 
  1. User user = Optional

  2. .ofNullable(getUserById(id))

  3. .orElseGet(() -> new User(0, "Unknown"));

  4.  
  5. System.out.println("Username is: " + user.getUsername());

4.orElseThrow

 

orElseThrow 与 orElse 方法的区别在于,orElseThrow 方法当 Optional 中有值的时候,返回值;没有值的时候会抛出异常,抛出的异常由传入的 exceptionSupplier 提供。

 
  1. User user = Optional

  2. .ofNullable(getUserById(id))

  3. .orElseThrow(() -> new EntityNotFoundException("id 为 " + id + " 的用户没有找到"));

举一个 orElseThrow 的用途:在 SpringMVC 的控制器中,我们可以配置统一处理各种异常。查询某个实体时,如果数据库中有对应的记录便返回该记录,否则就可以抛出 EntityNotFoundException ,处理 EntityNotFoundException 的方法中我们就给客户端返回Http 状态码 404 和异常对应的信息 —— orElseThrow 完美的适用于这种场景。

 
  1. @RequestMapping("/{id}")

  2. public User getUser(@PathVariable Integer id) {

  3. Optional<User> user = userService.getUserById(id);

  4. return user.orElseThrow(() -> new EntityNotFoundException("id 为 " + id + " 的用户不存在"));

  5. }

  6.  
  7. @ExceptionHandler(EntityNotFoundException.class)

  8. public ResponseEntity<String> handleException(EntityNotFoundException ex) {

  9. return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);

  10. }

5.map

 

如果当前 Optional 为 Optional.empty,则依旧返回 Optional.empty;否则返回一个新的 Optional,该 Optional包含的是:函数 mapper 在以 value 作为输入时的输出值。

 
  1. Optional<String> username = Optional

  2. .ofNullable(getUserById(id))

  3. .map(user -> user.getUsername());

  4.  
  5. System.out.println("Username is: " + username.orElse("Unknown"));

而且我们可以多次使用 map 操作:

 
  1. Optional<String> username = Optional

  2. .ofNullable(getUserById(id))

  3. .map(user -> user.getUsername())

  4. .map(name -> name.toLowerCase())

  5. .map(name -> name.replace('_', ' '));

  6.  
  7. System.out.println("Username is: " + username.orElse("Unknown"));

6.flatMap

 

flatMap 方法与 map 方法的区别在于,map 方法参数中的函数 mapper 输出的是值,然后 map 方法会使用 Optional.ofNullable 将其包装为 Optional;而 flatMap 要求参数中的函数 mapper 输出的就是 Optional

 
  1. Optional<String> username = Optional

  2. .ofNullable(getUserById(id))

  3. .flatMap(user -> Optional.of(user.getUsername()))

  4. .flatMap(name -> Optional.of(name.toLowerCase()));

  5.  
  6. System.out.println("Username is: " + username.orElse("Unknown"));

7.filter

 

filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty

 
  1. Optional<String> username = Optional

  2. .ofNullable(getUserById(id))

  3. .filter(user -> user.getId() < 10)

  4. .map(user -> user.getUsername());

  5.  
  6. System.out.println("Username is: " + username.orElse("Unknown"));


有了 Optional,我们便可以方便且优雅的在自己的代码中处理 null 值,而不再需要一昧通过容易忘记和麻烦的 if (object != null) 来判断值不为 null。如果你的程序还在使用 Java8 之前的 JDK,可以考虑引入 Google 的 Guava 库 —— 事实上,早在 Java6 的年代,Guava 就提供了 Optional 的实现。

http://www.lbrq.cn/news/790525.html

相关文章:

  • 外贸网站建设哪家公司比较好/广西壮族自治区在线seo关键词排名优化
  • 网站建设选择题题库/武汉抖音seo搜索
  • 做陌陌网站什么做/百度app官网下载安装
  • 网页游戏平台在线玩/seo推广教程
  • 表格如何给网站做链接地址/武汉百度搜索优化
  • 有没有教做网站的app/友情链接官网
  • 九亭镇村镇建设办官方网站/企业网络营销成功案例
  • 河西集团网站建设/辅导机构
  • 河南工程招标网站/seo优化信
  • a5做网站/站长工具大全集
  • 学做网站要多久多少钱/搜索引擎营销经典案例
  • 湖南做网站360o/windows优化大师怎么卸载
  • wordpress 调用站外api/引流人脉推广软件
  • 做服装公司需要什么网站/培训计划方案
  • 做网站后台怎么弄/输入关键词就能写文章的软件
  • 网站有死链怎么处理/app制作公司
  • 手机做网站对比路由器做网站/b站推广软件
  • 做教育网站挣钱/百度业务推广
  • 全球网购平台/深圳seo网络优化公司
  • 单位做网站备案用身份证有啥用/网络推广哪个好
  • javaweb做网站过程/企业推广宣传文案
  • 女的和男做那个视频网站/免费手机网页制作
  • 网站建设编程软件/新冠疫情最新消息今天公布
  • 做资源网站 文件能存储到云盘吗/关键词云图
  • 网站如何做线下推广/seo诊断方法步骤
  • 个人兴趣图片集网站建设/合肥seo网站管理
  • 免费网站建设/怎么样创建网站
  • 做快递单的网站会不会是骗人的/守游网络推广平台登陆
  • 高明专业网站建设报价/看啥网一个没有人工干预的网
  • wordpress布局插件/深圳关键词seo
  • [硬件电路-150]:数字电路 - 数字电路与模拟电路的异同
  • 曼哈顿距离与切比雪夫距离
  • 2025年EAAI SCI1区TOP,森林救援调度与路径规划:一种新型蚁群优化算法应用,深度解析+性能实测
  • 蛇形卷积介绍
  • Navicat连接远程服务器上的mysql
  • SpringBoot与TurboGears2跨栈、整合AI服务、智能客服路由系统整合实战