【Java8特性】——函数式接口方法引用

news2025/1/14 0:49:09

一、函数式(Functional)接口

1. 概述

  如果一个接口中,只声明了一个抽象方法, 则这个接口就称为函数式接口。
注解:@FunctionalInterface 显式指明改接口是一个函数式接口。可以检验是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。
  可以通过Lambda表达式创建该接口的对象(若Lambda表达式抛出一个受检异常,即非运行时异常,那么该异常需要在目标接口的抽象方法上进行声明)。
  在java.util.function包下定义了java8的丰富的函数式接口。

2. Java内置四大函数式接口

在这里插入图片描述

二、方法引用

1. 方法引用

<1> 简介

  方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例,所以方法引用,也是函数式接口的实例。
  方法引用可以看作是Lambda表达式的深层次的表达,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。

<2> 使用场景

  当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。

<3> 格式

  类(对象)::方法名

<4> 情况

1. 对象 :: 实例方法

    /**
     * 情况1
     * 对象 :: 实例方法
     * Consumer 中的 void accept(T t)
     * PrintStream 中的 void printly(T t)
     */
    @Test
    public void test1() {
        Consumer<String> con1 = str -> System.out.println(str);
        con1.accept("北京");
        System.out.println("--------------------------");

        Consumer<String> con2 = System.out::println;
        con2.accept("南京");
    }

    /**
     * 情况1
     * 对象 :: 实例方法
     * Supplier 中的 T get();
     * Employee 中的 String getName()
     */
    @Test
    public void test2() {
        Employee emp = new Employee(1001, "tom", 22, 100.22);
        Supplier<String> sup1 = () -> emp.getName();
        System.out.println(sup1.get());

        System.out.println("--------------------------");
        Supplier<String> sup2 = emp::getName;
        System.out.println(sup2.get());
    }

2. 类 :: 静态方法

    /**
     * 情况2
     * 类 :: 静态方法
     * Comparator 中的 int compare(T o1, T o2);
     * Integer 中的 int compare(int x, int y)
     */
    @Test
    public void test3() {
        Comparator<Integer> comparator1 = (t1, t2) -> Integer.compare(t1, t2);
        System.out.println(comparator1.compare(11112, 123));

        System.out.println("--------------------------");

        Comparator<Integer> comparator2 = Integer::compare;
        System.out.println(comparator2.compare(12, 123));

    }
    /**
     * 情况2
     * 类 :: 静态方法
     * Function 中的  R apply(T t)
     * Math 中的 long round(double a)
     */
    @Test
    public void test4() {
        Function<Double, Long> function1 = d -> Math.round(d);
        System.out.println(function1.apply(100.49));
        System.out.println("--------------------------");
        Function<Double, Long> function2 = Math::round;
        System.out.println(function2.apply(101.6));
    }

3. 类::实例方法

  Lambda 有两个参数, 但方法引用中只有一个参数,其中 Lambda的第一个参数作为调用者

    /**
     * 情况3
     * 类::实例方法
     * Lambda 有两个参数, 但方法引用中只有一个参数,其中 Lambda的第一个参数作为调用者
     * Comparator 中的 int compare(T o1, T o2);
     * String 中的 int t1.compartTo(t2);
     */
    @Test
    public void test5() {
        Comparator<String> comparator1 = (t1, t2) -> t1.compareTo(t2);
        System.out.println(comparator1.compare("1233", "1233"));

        System.out.println("--------------------------");
        Comparator<String> comparator2 = String::compareTo;
        System.out.println(comparator2.compare("12332", "1233"));
    }

  Lambda 有一个参数, 但方法引用中没有参数, Lambda的参数作为调用者

    /**
     * Lambda 有一个参数, 但方法引用中没有参数, Lambda的参数作为调用者
     * Function 中的  R apply(T t)
     * Employee 中的 String getName()
     */
    @Test
    public void test7() {
        Employee emp = new Employee(1001, "tom", 22, 100.22);
        Function<Employee, String> function1 = e -> e.getName();
        System.out.println(function1.apply(emp));
        System.out.println("--------------------------");
        Function<Employee, String> function2 = Employee::getName;
        System.out.println(function2.apply(emp));
    }

2. 构造器引用

<1> 无参Lambda ,无参构造器

    /**
     * 构造器引用 , 无参构造器
     * Supplier 中的 T get();
     */
    @Test
    public void test1() {

        Supplier<Employee> supplier1 = () -> new Employee();
        Employee employee1 = supplier1.get();
        System.out.println(employee1);
        System.out.println("--------------------------------------------------------------------");

        Supplier<Employee> supplier2 = Employee::new;
        Employee employee2 = supplier2.get();
        System.out.println(employee2);
    }

<2> 一个参数Lambda ,一个参数构造器

 /**
     * 构造器引用 , 一个参数构造器
     * Function 中的  R apply(T t);
     */
    @Test
    public void test2() {
        Function<Integer, Employee> function1 = id -> new Employee(id);
        Employee employee1 = function1.apply(2);
        System.out.println(employee1);
        System.out.println("--------------------------------------------------------------------");
        Function<Integer, Employee> function2 = Employee::new;
        Employee employee2 = function2.apply(3);
        System.out.println(employee2);
    }

<3>二个参数Lambda ,二个参数构造器

   /**
     * 构造器引用 , 二个参数构造器
     */
    @Test
    public void test3() {
        BiFunction<Integer, String, Employee> biFunction1 = (id, name) -> new Employee(id, name);
        Employee employee1 =  biFunction1.apply(2, "jack");
        System.out.println(employee1);
        System.out.println("--------------------------------------------------------------------");

        BiFunction<Integer, String, Employee> biFunction2 = Employee::new;
        Employee employee2 = biFunction2.apply(3, "tom");
        System.out.println(employee2);
    }

3. 数组引用

  数组引用 可以看作是一个特殊的类

/**
     * 数组引用
     * 数组引用 可以看作是一个特殊的类
     * Function 中的  R apply(T t);
     *
     */
    @Test
    public void test4() {

        Function<Integer, String[]> function1 = length -> new String[length];
        String[] array1 = function1.apply(10);
        System.out.println(array1.length);
        System.out.println("--------------------------------------------------------------------");

        Function<Integer, String[]> function2 = String[]::new;
        String[] array2 = function2.apply(13);
        System.out.println(array2.length);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/917084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用 Databend 助力 CDH 分析 | 大参林

作者&#xff1a; 黄志武 大参林医药集团股份有限公司&#xff0c;信息中心数据库组组长&#xff0c;13年数据库行业从业经历&#xff0c;Oracle OCM&#xff0c;关注Oracle、MySQL、Redis、MongoDB、Oceanbase、Tidb、Polardb-X、TDSQL、CDH、Clickhouse、Doris、Databend等多…

【ES6】—【必备知识】—对象的扩展

一、属性简洁表示法 ES5 写法 let name xiao let age 30 let obj {name: name,age: age } console.log(obj) // {name: xiao, age: 30}ES6 简洁写法 对象的属性名 和 属性值的变量名相同&#xff0c;可以简写成 一个属性名 let name xiao let age 30 let obj {name,age …

如果你还不知道电商(淘宝京东1688)API,就看这里!

随着电商的蓬勃发展&#xff0c;现在已经进入了全民电商的时代&#xff1b;从国内电商到跨境电商&#xff0c;可以说是百家争艳&#xff0c;同时&#xff0c;电商运营也变得更精细化&#xff0c;各种运营工具也相继涌现&#xff0c;为店铺业绩做保障&#xff0c;电商API就是这样…

【回眸】牛客网刷刷刷!(七)——通信协议之 网络通讯

目录 前言 1、TCP/IP分层模型 2、ARP缓存 3、TCP 协议之所以提供可靠传输&#xff0c;不怕丢包、乱序的主要的原因是 4、以太网数据链路层MII/GMII/RMII/RGMII四种常用接口 5、在以太网通信协议LWIP中&#xff0c;数据包管理机构采用数据结构pbuf 分类包括 6、关于以太网…

关于css 的选择器和 css变量

css 选择器 常用的选择器 1. 后代选择器&#xff1a;也就是我们常见的空格选择器&#xff0c;选择的对象为该元素下的所有子元素 。例如&#xff0c;选择所有 元素下的 元素 div p{font-size:14px}2. 子元素选择器 ‘>’ 选择某元素下的直接子元素。例如&#xff0c;选择所…

龙蜥白皮书精选:云原生混部资源隔离技术

文/云原生 SIG 01 技术方案简介 混部就是将不同类型的业务在同一台机器上混合部署起来&#xff0c;让它们共享机器上的 CPU、内存、IO 等资源&#xff0c;目的就是最大限度地提高资源利用率&#xff0c;从而降低采购和运营等成本。 混部通常是将不同优先级的任务混合在一起&a…

前端开发进阶:前端开发中如何高效渲染大数据量?

在日常工作中&#xff0c;有时会遇到一次性往页面中插入大量数据的场景&#xff0c;在数栈的离线开发&#xff08;以下简称离线&#xff09;产品中&#xff0c;就有类似的场景。本文将通过分享一个实际场景中的前端开发思路&#xff0c;介绍当遇到大量数据时&#xff0c;如何实…

【1782. 统计点对的数目】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成&#xff0c;其中 edges[i] [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询…

display设为inline-block时引发的高度问题,大坑

今天在写小程序&#xff0c;点击让这个遮罩层显示&#xff0c;结果一直下移&#xff0c;莫名其妙。 解决方案&#xff1a; 在元素的CSS中添加&#xff1a;vertical-align: bottom;

minAreaRect 函数新版与旧版对比

minAreaRect 函数 cv2.minAreaRect (InputArray_points) 入参 points 是点的集合&#xff0c;如轮廓 返回值 RotatedRect,带角度的旋转矩形框,其值形如(center(x,y), (width, height), angle of rotation ) center(x,y), (width, height)分别是旋转矩形框中心的坐标和矩…

chrome浏览器账号密码输入框自动填充时背景色不变

处理前 使用延时的方式解决 .login-box input,password:-webkit-autofill .login-box input,password:-webkit-autofill:hover, .login-box input,password:-webkit-autofill:focus, .login-box input,password:-webkit-autofill:active {-webkit-transition-delay: 999999…

【HMS Core】在线语种检测返回结果错误

【关键字】 在线语种检测、机器学习 【问题描述】 集成在线语种检测服务&#xff0c;检测蒙古文之后&#xff0c;返回结果为中文 【问题分析】 1、在线语种服务目前不支持蒙古文&#xff0c;具体可见官网语种支持列表&#xff1a; 【ML Kit】语种检测支持的语言列表 2、目前…

【JAVA毕设|课设】基于SpringBoot+vue的在线考试系统-以计算机网络为例,可自行录入题库-附下载地址

基于SpringBootvue的在线考试系统-以计算机网络为例&#xff0c;可自行录入题库 一、项目简介二、开发环境三、项目技术四、功能结构五、运行截图六、功能实现七、数据库设计八、源码获取 一、项目简介 随着信息技术的迅猛发展&#xff0c;教育行业正面临着巨大的变革和挑战。…

RTP/RTCP的 NACK, PLI,SLI,FIR

1&#xff0c;概述 在网络环境不是太好的情况下&#xff0c;比如网络拥塞比较严重&#xff0c;丢包率可能比较高&#xff0c;简单实用NACK重传的机制&#xff0c;这样就会有大量的RTCP NACK报文&#xff0c;发送端收到相应的报文&#xff0c;又会发送大量指定的RTP报文&#x…

5G NR:PRACH时域资源

PRACH occasion时域位置由高层参数RACH-ConfigGeneric->prach-ConfigurationIndex指示&#xff0c;根据小区不同的频域和模式&#xff0c;38.211的第6.3.3节中给出了prach-ConfigurationIndex所对应的表格。 小区频段为FR1&#xff0c;FDD模式(paired频谱)/SUL&#xff0c;…

【前端从0开始】JavaSript——循环控制语句

循环控制语句 while语句 While 循环会在指定条件为真时循环执行代码块。 While循环&#xff0c;先进行条件判断&#xff0c;再执行循环体的代码 while (条件表达式){循环体 }注意&#xff1a;当前循环中&#xff0c;如果不满足条件&#xff0c;一次都不会执行 var i 1; whi…

利用tidevice+mysql+grafana实现ios性能测试

利用tidevicemysqlgrafana实现ios性能测试 1.什么是tidevice&#xff1f; tidevice是一个可以和ios设备进行通信的工具&#xff0c;提供以下功能&#xff1a; 截图获取手机信息ipa包的安装和卸载根据bundleID 启动和停止应用列出安装应用信息模拟Xcode运行XCTest&#xff0c…

学会Mybatis框架:让你的代码更具灵活性、可维护性、安全性和高效性【二.动态SQL】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Mybatis动态SQL如何应用 1.需求 2.…

2022美亚杯个人赛复刻

案件详情 于2022年10月&#xff0c;有市民因接获伪冒快递公司的电邮&#xff0c;不慎地于匪徒架设的假网站提供了个人信用咭资料导致经济损失。 警方追查下发现当中一名受骗市民男子李大輝 (TaiFai) 的信用卡曾经被匪徒在区内的商舖购物。 后来警方根据IP地址&#xff0c;锁定…

js实现定时器

用原生js实现一个倒计时效果.最下面有全部源码,需要自取 js语法: setTimeout:定时器 document.getElementById:Document的方法 getElementById()返回一个匹配特定 ID的元素。由于元素的 ID 在大部分情况下要求是独一无二的&#xff0c;这个方法自然而然地成为了一个高效查找特…