Optional

Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

常用方法:

Optional.of(T t) : 创建一个 Optional 实例。

Optional.empty() : 创建一个空的 Optional 实例。

Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例。

isPresent() : 判断是否包含值。

orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。

orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。

map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()。

flatMap(Function mapper):与 map 类似,要求返回值必须是Optional。

下面引用ImportNew的一段内容来告诉我们如何正确使用Optional。比如千万不要写成这样子:

public static String getName(User u) {Optional<User> user = Optional.ofNullable(u);if (!user.isPresent())return "Unknown";return user.get().name; }

这样改写非但不简洁,而且其操作还是和第一段代码一样。无非就是用isPresent方法来替代u==null。这样的改写并不是Optional正确的用法,我们再来改写一次。

public static String getName(User u) { return Optional.ofNullable(u) .map(user->user.name) .orElse("Unknown"); }

这样才是正确使用Optional的姿势。那么按照这种思路,我们可以安心的进行链式调用,而不是一层层判断了。看一段代码:

public static String getChampionName(Competition comp) throws IllegalArgumentException { if (comp != null) { CompResult result = comp.getResult(); if (result != null) { User champion = result.getChampion(); if (champion != null) { return champion.getName(); } } } throw new IllegalArgumentException("The value of param comp isn't available."); }

由于种种原因(比如:比赛还没有产生冠军、方法的非正常调用、某个方法的实现里埋藏的大礼包等等),我们并不能开心的一路comp.getResult().getChampion().getName()到底。而其他语言比如kotlin,就提供了在语法层面的操作符加持:comp?.getResult()?.getChampion()?.getName()。所以讲道理在Java里我们怎么办!

让我们看看经过Optional加持过后,这些代码会变成什么样子。

public static String getChampionName(Competition comp) throws IllegalArgumentException { return Optional.ofNullable(comp) .map(c->c.getResult()) .map(r->r.getChampion()) .map(u->u.getName()) .orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available.")); }

这就很舒服了。Optional的魅力还不止于此,Optional还有一些神奇的用法,比如Optional可以用来检验参数的合法性。

public void setName(String name) throws IllegalArgumentException {this.name = Optional.ofNullable(name).filter(User::isNameValid).orElseThrow(()->new IllegalArgumentException("Invalid username.")); }

上面代码引用importnew—Java8 如何正确使用 Optional。

接口中的默认方法与静态方法

Java8接口中可以添加静态方法,也可以添加默认方法,默认方法用 default修饰。

public interface Fun<T> { default void getName(){ System.out.println("hello world"); } static void getAge(){ System.out.println("nine"); } }

若一个接口中定义了一个默认方法,他的实现类的一个父类定义了具有相同名称和参数列表的方法。则调用该实现类的时候执行父类中的方法。

public class TestF {public void getName(){ System.out.println("TestF"); } } public interface TestInterface { default void getName(){ System.out.println("hello world"); } } public class Test extends TestF implements TestInterface{ public static void main(String[] args) { Test t = new Test(); t.getName();//输出的是TestF } }

若一个实现类实现了两个接口,如果一个父接口提供一个默认方法,而另一个父接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突,否则会报错。

public interface TestInterface {default void getName(){ System.err.println("hello world"); } } public interface TestInterface1 { void getName(); } public class Test1 implements TestInterface, TestInterface1{ public void getName(){ System.out.println("Tes1F"); } }java学习群669823128

转载于:https://www.cnblogs.com/rese-t/p/7977605.html

Java8新特性Optional、接口中的默认方法与静态方法相关推荐

  1. Java8新特性_接口中的默认方法

    默认方法由来猜想 1. Collection接口.Collections公共类.  同是操作集合,为啥要搞俩?没必要.在接口中搞一些默认实现,一个接口即搞定了. 2. Java8支持Lambda表达式 ...

  2. 接口中默认方法和静态方法_接口中的默认方法和静态方法

    接口中默认方法和静态方法 在我们最初的Java 8支持公告中,我们特别提到了流的缺乏,但完全错过了默认/静态本机接口不起作用的事实. 现在,由于有一个警惕的社区成员指出了这一问题,因此此问题已得到解决 ...

  3. 接口中的默认方法和静态方法

    在我们最初的Java 8支持公告中,我们特别提到了缺少流,但是完全错过了默认/静态本机接口不起作用的事实. 现在,由于有一个警惕的社区成员指出了这一问题,因此此问题已得到解决. 由于限制需要全新构建才 ...

  4. Java接口中的默认方法冲突

    在Java中,我们可以为其接口中定义的方法提供一个默认的实现.当然,这可能并没有很大的用处,不过,在某些情况下可能很有用!如果要为接口方法提供一个默认实现,必须要用 default关键字 修饰. 在为 ...

  5. java8新特性_乐字节-Java8新特性-函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  6. Java8新特性 Optional类

    作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了.这篇文章我们来学习Java8是如何通过 ...

  7. Java8新特性——Optional 类

    文章目录 前言 Optional 类 1.概述 2.API介绍 of ofNullable empty isPresent get ifPresent orElse orElseGet orElseT ...

  8. Java8新特性-Optional

    文章目录 简介 Optional源码分析和使用场景 属性和构造 常用方法 get()方法 isPresent()方法 ifPresent(Consumer<? super T> consu ...

  9. Java8新特性-Optional,狂神说docker笔记百度云

    // 这个是通用的代表NULL值的Optional实例private static final Optional<?> EMPTY = new Optional<>();// ...

最新文章

  1. 经常可能会用到的【函数节流和函数防抖】记录下,做下区分
  2. java自己实现读写锁_关于读写锁算法的Java实现及思考
  3. Linux 终端访问 FTP 及 上传下载 文件
  4. Linux下cacti的安装RedHat9,RedHat AS4
  5. java英语介绍_java,英文介绍项目.doc
  6. leetcode 497, 528. Random Point in Non-overlapping Rectangles | 497. 非重叠矩形中的随机点(Java)
  7. Python(6):工程组织结构
  8. 包含html语言的超链接标记的网页_零基础入门 HTML 的 8 分钟极简教程
  9. Netty实例-简单的服务端-client实现,凝视具体
  10. Gmail有充分理由启用SSL加密会话
  11. 图片格式转换大小调整工具_如何轻松快速地将图片转换到JPG/JPEG/PNG/BMP/TIFF
  12. 二分答案——跳石头(洛谷 P2678)
  13. sql server 2008新特性:资源调控器
  14. PCB 电测试--测试点数自动输出到流程指示中(读取TGZ Stephdr文件)
  15. linux操作系统基础及应用课后答案,Linux操作系统课后习题答案及复习要点
  16. 王佩丰 Excel 24节课 学习笔记
  17. WhatsApp被禁用该如何操作呢?实操WhatsApp解封全过程| 2022五月
  18. 对浮点数取模(求余)
  19. 最小二乘解(Least-squares Minimization )
  20. mysql字符集修改无效,Mysql字符集的修改及查看问题_MySQL

热门文章

  1. C++实现矩阵加减乘求转置
  2. first-child伪类选择器没有效果(不起作用)
  3. CTFshow 命令执行 web69
  4. CTFshow 信息收集 web20
  5. sdut 1488 连通分量的个数(并查集)
  6. 第3周实践项目7 删除链表元素最大值
  7. Python 基础语法(四)
  8. Python进阶01 词典
  9. 数据结构期末考试题目---笔记(SYSU)
  10. 利用Matlab比较IIR和FIR,细说IIR滤波器和FIR滤波器的区别