JDK1.8新特性之方法引用 ::和Optional详解

JDK1.8新特性之方法引用 ::

简介

方法引用是一种比Lambda表达式更简洁易读的代码编写方式,它可以将已有的方法作为值传递,并将其应用到函数式接口中。方法引用的核心操作符是 ::,它可以引用一个方法或构造函数。

使用方法

方法引用可以拆分成两个部分:方法或构造函数的引用和方法类型的定义。方法或构造函数的引用可以是以下三种形式之一:

  • 静态方法引用:ClassName::staticMethodName
  • 实例方法引用:objectName::instanceMethodName
  • 构造函数引用:ClassName::new

方法类型的定义可以是以下三种形式之一:

  • 无参方法
  • 带一个参数方法
  • 带多个参数方法

示例

静态方法引用:

假设有一个接口 MyInterface,其中定义了一个无参方法 myMethod

public interface MyInterface {
    void myMethod();
}

现在我们有一个静态方法 doSomething

public static void doSomething() {
    System.out.println("Do Something!");
}

那么我们可以使用静态方法引用将 doSomething 方法绑定到 myMethod 上,代码如下:

MyInterface mi = Main::doSomething;

// 调用 myMethod
mi.myMethod();

实例方法引用:

同样假设有一个接口 MyInterface

public interface MyInterface {
    void printMsg(String msg);
}

我们有一个类 MyClass,其中定义了方法 print

public class MyClass {
    public void print(String msg) {
        System.out.println(msg);
    }
}

现在我们可以使用实例方法引用将 MyClass 的实例方法 print 绑定到 MyInterface 的方法 printMsg 上,代码如下:

MyClass mc = new MyClass();
MyInterface mi = mc::print;

// 调用 printMsg
mi.printMsg("Hello, world!");

构造函数引用:

我们可以使用构造函数引用来创建新的对象。假设有一个类 Person

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

我们可以使用构造函数引用来快速创建 Person 对象,代码如下:

Supplier<Person> personSupplier = Person::new;
Person p1 = personSupplier.get();
Person p2 = personSupplier.get();

// 输出 p1.getName() 和 p2.getName()
System.out.println(p1.getName());
System.out.println(p2.getName());

Optional详解

简介

在JDK1.8中,新增了一个 Optional 类,它是一个容器对象,可以包含 null 或者非 null 的值。使用 Optional 类能有效地避免一些空指针异常的问题。

使用方法

Optional 类中常用的方法有以下几个:

  • ofNullable:如果值存在,返回 Optional 实例,否则返回一个空的 Optional 实例。
  • orElse:如果有值则将其返回,否则返回一个默认值。
  • ifPresent:如果值存在则使用该值调用 consumer,否则不执行任何操作。
  • isPresent:如果值存在则方法会返回 true,否则返回 false。
  • get:如果有值则将其返回,否则抛出 NoSuchElementException。
  • orElseGet:与 orElse 类似,区别在于返回值类型不同。orElseGet 方法接受一个 Supplier 对象作为参数。如果有值则将其返回,否则返回 Supplier 接口实现的对象。
  • orElseThrow:如果有值则将其返回,否则抛出 Supplier 接口创建的异常。

示例

假设有一个对象 Person

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

现在我们可以使用 Optional 类来对 Person 对象进行判断并进行有效的处理:

Person person1 = new Person("张三", 18);
Person person2 = null;

Optional<Person> optional = Optional.ofNullable(person1);

// 如果 optional 中的值存在,则输出 "张三的年龄为:18",否则输出 "person2 不存在"
optional.ifPresent(p -> System.out.println(p.getName() + "的年龄为:" + p.getAge()));

optional = Optional.ofNullable(person2);

// 如果 optional 中的值存在,则输出 "null",否则输出 "person2 不存在"
System.out.println(optional.orElse(null));

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JDK1.8新特性之方法引用 ::和Optional详解 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • 教你使用Psycopg2连接openGauss的方法

    下面是“教你使用Psycopg2连接openGauss的方法”的完整攻略。 Psycopg2和openGauss简介 Psycopg2是一个Python数据库连接库,专门用于连接PostgreSQL数据库。openGauss是一款开源的高性能数据库,与PostgreSQL基本兼容,因此也可以使用Psycopg2连接openGauss数据库。 安装Psycop…

    database 2023年5月18日
    00
  • mysql 查询当天、本周,本月,上一个月的数据

    要查询当天、本周、本月或上一个月的数据,可以使用MySQL中的DATE_FORMAT()函数和NOW()函数,结合WHERE子句进行过滤。 下面是一些示例说明: 1. 查询当天的数据 SELECT * FROM table_name WHERE DATE_FORMAT(date_column, ‘%Y-%m-%d’) = DATE_FORMAT(NOW(),…

    database 2023年5月22日
    00
  • Oracle和Derby的区别

    Oracle和Derby都是关系型数据库管理系统(RDBMS),但二者在概念、功能、性能和使用方面都存在一些显著的不同。下面通过详细讲解Oracle和Derby的区别,为大家提供一个完整的攻略。 Oracle和Derby的概念区别 1.1 Oracle的概念 Oracle是由Oracle公司研发的一款商业性质的关系型数据库管理系统,是现今最流行的企业级数据库…

    database 2023年3月27日
    00
  • Oracle VM VirtualBox 安装CentOS7操作系统的教程图解

    首先,安装CentOS7操作系统前需要先安装Oracle VM VirtualBox,所以我们需要先下载并安装VirtualBox(因为下载和安装过程比较简单,这里就不赘述了,可以自行在搜索引擎中搜索相关教程)。 接下来,我们进入CentOS官网下载CentOS7的ISO镜像文件。下载完成后,在VirtualBox中创建一个新的虚拟机,按照下面的步骤进行设置…

    database 2023年5月22日
    00
  • Redis中事件驱动模型示例详解

    下面我就来详细讲解一下“Redis中事件驱动模型示例详解”的攻略。 一、Redis中事件驱动模型解析 1. 什么是事件驱动模型? 事件驱动模型是指程序员通过编写对事件做出响应的代码,程序可以在一个或多个事件发生时执行相应的操作。在事件驱动模型中,程序的处理流程是由事件决定的。 2. Redis中的事件驱动模型 Redis使用单线程来处理请求和响应。它采用了事…

    database 2023年5月22日
    00
  • SQL注入报错注入函数图文详解

    SQL注入报错注入函数图文详解 什么是SQL注入 SQL注入是一种古老而又经典的安全漏洞,它可以让攻击者通过软件应用程序的输入接口,将恶意SQL语句插入到后台数据库中。这样一来,攻击者就可以得到有关数据库、应用程序逻辑以及系统访问控制的任何信息。 SQL注入报错注入 SQL注入报错注入一种SQL注入方式。它基于报错机制(错误信息)来进行攻击。在正常情况下,当…

    database 2023年5月18日
    00
  • Linux的使用

    Linux的使用攻略 简介 Linux是一种自由、开放源代码的类Unix操作系统,最初由芬兰的Linus Torvalds编写,后来得到了全球GNU开发者的支持和参与。Linux是在POSIX和UNIX标准化的基础上开发的,其主要特点包括多用户、多任务、支持多个处理器、支持虚拟内存、支持分时和实时调度等功能。 Linux被广泛用于服务器领域、超级计算机、嵌入…

    database 2023年5月22日
    00
  • SQL – Distinct 语句

    当我们使用SELECT语句来查询数据时,有的时候我们需要获取不重复的记录,这时我们可以使用DISTINCT语句来实现。 语法: SELECT DISTINCT 列名 FROM 表名; DISTINCT语句仅适用于查询结果中的列,如果列不在SELECT语句中,则不会过滤掉重复记录。 下面是两个实例来展示DISTINCT语句的使用: 1.查询学生表中不同的班级 …

    database 2023年3月27日
    00
合作推广
合作推广
分享本页
返回顶部