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日

相关文章

  • 精炼mysql的数据,并且存放到redis中。

    # -*- coding:utf8 -*- ”’ Created on 2016年11月29日 @author: qiancheng ”’ import MySQLdb from email.mime.text import MIMEText from email.header import Header import smtplib import re…

    Redis 2023年4月11日
    00
  • 人工智能掘金热中 第四范式想把AI做成人人能用的应用

    人工智能掘金热中第四范式想把AI做成人人能用的应用 简介 近年来,人工智能技术在许多领域取得了重要进展,应用也日益广泛。但是,开发人工智能应用需要掌握一定的技能和专业知识,对于普通用户来说并不容易。第四范式认为,将AI做成人人能用的应用非常重要,他们希望开发出一款能够帮助用户自主掌握人工智能技术的产品。 攻略 第四范式开发的人工智能平台“AI Studio”…

    database 2023年5月19日
    00
  • PHP实现的简单分页类及用法示例

    下面我就给出详细的“PHP实现的简单分页类及用法示例”的完整攻略。 准备工作 在使用分页类之前,我们需要先确定每一页显示的记录数、总记录数和当前页码。同时,我们还需要确保PHP已经安装并成功配置。 实现分页类 下面是一段PHP实现的简单分页类的代码: class Page { private $total; // 总记录数 private $pagesize…

    database 2023年5月21日
    00
  • 用SQL实现统计报表中的”小计”与”合计”的方法详解

    下面是使用SQL实现统计报表中的”小计”与”合计”的方法详解: 为什么需要小计和合计? 在统计报表中,通常需要按照某个分类字段(如部门、时间、地区等)进行汇总,同时还需要在每个分类下计算小计和整个报表的合计。小计是指每个分类下的汇总值,合计是指整个报表的汇总值。这样做可以使数据更加清晰明了,方便读者快速了解各项数据的变化趋势和关键指标。 如何使用SQL实现小…

    database 2023年5月21日
    00
  • linux实现mysql数据库每天自动备份定时备份

    首先我们需要安装crontab,一个在Linux下用来定时执行任务的工具。可以使用以下命令进行安装: sudo apt-get update sudo apt-get install cron 安装完成后,我们需要编辑cron的定时任务配置文件。在终端输入以下命令: crontab -e 该命令会打开当前用户的crontab配置文件。接下来,我们可以在文件中…

    database 2023年5月22日
    00
  • SQL 展现父子关系

    展现父子关系是 SQL 中非常常见的需求,在设计数据库中经常会遇到。下面是 SQL 展现父子关系的完整攻略: 1. 定义父子关系 在 SQL 中,通常需要借助两个字段来定义父子关系:父节点 ID 和子节点 ID。一般情况下,我们会在子节点表中增加一个名为“parent_id”的列,用于存储其父节点的 ID 值。 2. 树形结构查询 当数据库中存在一个树形结构…

    database 2023年3月27日
    00
  • Linux下卸载MySQL数据库

    这里给出详细的“Linux下卸载MySQL数据库”的完整攻略,具体操作如下: 步骤一:停止MySQL服务 首先需要停止正在运行的MySQL服务。可以使用以下命令停止MySQL服务: sudo service mysql stop 步骤二:卸载MySQL 卸载MySQL可以使用以下命令: sudo apt-get –purge remove mysql-se…

    database 2023年5月22日
    00
  • C++使用redis的实例详解

    C++使用redis的实例详解 什么是Redis? Redis是一个开源(BSD许可)的基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)等,并支持像事务(transactions)、Pub/Sub(发布与订阅)和 Lua 脚…

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