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日

相关文章

  • Python MySQLdb Linux下安装笔记

    Python MySQLdb Linux下安装攻略 1. 安装MySQL数据库 Python MySQLdb是MySQL数据库的一个Python接口库,因此在安装MySQLdb前,需要先正确安装MySQL数据库。以下步骤将展示如何在Linux系统下安装MySQL数据库。 使用以下命令更新包列表: bash sudo apt-get update 使用以下命令…

    database 2023年5月22日
    00
  • CentOS7.5安装配置Harbor1.7的全过程

    CentOS7.5安装配置Harbor1.7的全过程 简介 Harbor是企业级的Docker镜像仓库,提供安全、可靠的镜像管理功能,支持LDAP、AD认证、权限管理、日志审计等企业级功能。本文将详细介绍在CentOS7.5上安装配置Harbor1.7的全过程。 准备 安装了CentOS7.5操作系统的服务器,具备root权限。 安装Docker Harbo…

    database 2023年5月22日
    00
  • 运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist

    第一步:在管理员命令中输入: mysql_upgrade -u root -p –force 第二步:重新启动mysql的服务: net stop mysql net start mysql 再次运行mysql,就解决了。   然后重新授权远程连接: 在本机先使用root用户登录mysql: mysql -u root -p”youpassword” 进行…

    MySQL 2023年4月13日
    00
  • Java程序员编程性能优化必备的34个小技巧(总结)

    Java程序员编程性能优化必备的34个小技巧(总结) 优化内存: 1. 手动置空不再使用的对象的引用 Java中有自动垃圾回收器,但它并不会立即把内存释放,而是等待某个特定的时刻。因此,在使用完一个对象之后,主动置空这个对象的引用,可以提高垃圾回收器的效率,进而提升程序的性能。 示例代码: Object obj = new Object(); // obj对…

    database 2023年5月21日
    00
  • Docker部署SQL Server 2019 Always On集群的实现

    下面我来简单介绍一下Docker部署SQL Server 2019 Always On集群的实现攻略。 一、概述 SQL Server 2019 Always On集群是一种高可用的解决方案,可以保证数据库服务的连续性和可靠性。而采用Docker部署SQL Server 2019 Always On集群,则可以更容易地进行部署和管理。 二、实现步骤 准备Do…

    database 2023年5月22日
    00
  • mysql中between的边界,范围说明

    当我们在MySQL中使用BETWEEN AND查询语句时,会涉及到几个边界和范围的概念。 BETWEEN:表示两个边界之间的范围,包括两个边界值; AND:表示区间的分隔符; 边界:指定的范围的开始和结束值。 下面,我们通过几个示例详细讲解这些概念: 查询指定范围内的数据 例如,我们查询用户表中年龄在20岁到30岁之间的用户信息: SELECT * FROM…

    database 2023年5月22日
    00
  • SQL 插入默认值

    当我们向数据库表中插入新记录时,有时候可能只想指定一些字段的具体值,而其它字段的值可以使用默认值。在SQL中,可以通过 INSERT INTO 语句中的 VALUES 关键字或者 INSERT INTO … SET 语句中的 DEFAULT 关键字来设置默认值。 下面,我将为大家提供详细的SQL插入默认值的攻略,包括两个实例。 表格结构 users 表格…

    database 2023年3月27日
    00
  • C#利用GDI绘制常见图形和文字

    C#利用GDI绘制常见图形和文字攻略 简介 GDI(Graphics Device Interface)是Windows图形设备接口,提供了一系列绘制函数,使用GDI可以实现对Windows图形界面的高级控制。C#通过PInvoke方法可以调用GDI的各个函数,通过GDI实现绘制图形和文字,可用于Windows窗体界面设计。本攻略将介绍如何使用C#和GDI绘…

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