当前位置: 首页 > news >正文

Java之方法引用

目录

一、什么是方法引用

二、方法引用的规则

三、方法引用的分类:

(一)、引用静态方法

(二)、引用成员方法

1、引用其他类的成员方法

2、引用本类的成员方法

3、引用父类的成员方法

(三)、引用构造方法

(四)、其他调用方式

1、使用类名引用成员方法

2、引用数组的构造方法


一、什么是方法引用

把已经有的方法拿过来,当做函数式接口中抽象方法的方法体。

Java的方法引用是一种新的语法,可以简化Lambda表达式的使用。方法引用可以将已有的方法作为Lambda表达式的替代进行传递。在Java中,方法引用使用双冒号(::)操作符来表示。

二、方法引用的规则

  1. 引用处必须是函数式接口
  2. 被引用的方法必须已经存在
  3. 被引用方法的形参和返回值需要跟抽象方法保持一致
  4. 被引用方法的功能要满足当前需求

三、方法引用的分类:

(一)、引用静态方法

格式:类名::静态方法

范例:Integer::parseInt

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "1", "2", "3", "4", "5");List<Integer> collect = list.stream().map(Integer::parseInt).collect(Collectors.toList());
System.out.println(collect);
(二)、引用成员方法

格式:对象::成员方法

1、引用其他类的成员方法

格式:其他类对象::成员方法


public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,  "张无忌",  "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");list.stream().filter(new StringOperation()::stringJudge).forEach(s -> System.out.println(s));}class StringOperation{public boolean stringJudge(String s){return s.startsWith("张") && s.length() == 3;}
}
2、引用本类的成员方法

格式:this::成员方法

注:如果是在静态方法中,是没有this的,只能用对象名

public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,  "张无忌",  "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");List<String> collect= new Demo4().method(list);System.out.println(collect);
}public List<String> method(List<String> list){return list.stream().filter(this::stringJudge).collect(Collectors.toList());
}public boolean stringJudge(String s){return s.startsWith("张") && s.length() == 3;
}
3、引用父类的成员方法

格式:super::成员方法

注:如果是在静态方法中,是没有super的,只能用对象名

public class Demo5 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,  "张无忌",  "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");List<String> collect = new Son().method(list);System.out.println(collect);}
}class Son extends Father {public List<String> method(List<String> list){return list.stream().filter(super::stringJudge).collect(Collectors.toList());}
}class Father{public boolean stringJudge(String s){return s.startsWith("张") && s.length() == 3;}
}
(三)、引用构造方法

格式:类名::new

范例:Student::new

public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌,32", "张强,29", "张三丰,56", "张翠山,48", "张良,25", "王二麻子,28", "谢广坤,39");List<Student> collect = list.stream().map(Student::new).collect(Collectors.toList());System.out.println(collect);
}public class Student {private String name;private int age;public Student() {}public Student(String s) {this.name = s.split(",")[0];this.age = Integer.parseInt(s.split(",")[1]);}public Student(String name, int age) {this.name = name;this.age = age;}…………
}
(四)、其他调用方式
1、使用类名引用成员方法

格式:类名::成员方法

范例:String::substring

特有规则: 

  1. 引用处必须是函数式接口
  2. 被引用的方法必须已经存在
  3. 被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致
  4. 被引用方法的功能要满足当前需求

抽象方法形参的详解:

  • 第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法,在stream 流当中,第一个参数一般都表示流里面的每一个数据。假没流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用 string 这个类中的方法
  • 第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法

局限性:

        不能引用所有类中的成员方法。是跟抽象方法的第一个参数有关,这个参数是什么类型的,那么就只能引用这个类中的方法。

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "aaa", "bbb", "ccc", "ddd");List<String> collect = list.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(collect);
2、引用数组的构造方法

格式:类名::new

范例:Student::new

ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5);Integer[] arr = list.stream().toArray(Integer[]::new);
System.out.println(Arrays.toString(arr));

相关文章:

  • MySQL事务与MVCC详解
  • LeetCode Hot100 25.K个一组翻转链表
  • AI日报:麻省理工学院专家呼吁扩大人工智能治理和监管
  • Verilog Systemverilog define宏定义
  • web前端之中文输入法导致的高频事件、addEventListener、compositionstart、compositionend
  • HPM6750系列--第九篇 GPIO详解(基本操作)
  • Github与Gitlab
  • CentOS 7 部署 dnsmasq
  • jpa 修改信息拦截
  • 信息学奥赛一本通 第二章 顺序结构程序设计 第一、二节C语言非C++
  • 【网络编程】-- 04 UDP
  • Windows mysql5.7 执行查询/开启/测试binlog---简易记录
  • 阿木实验室普罗米修斯项目环境配置
  • Centos7部署SVN
  • 基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(六)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • ES6指北【2】—— 箭头函数
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • iOS 颜色设置看我就够了
  • Javascript基础之Array数组API
  • Java编程基础24——递归练习
  • Node 版本管理
  • Python_OOP
  • React中的“虫洞”——Context
  • SpringBoot 实战 (三) | 配置文件详解
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Terraform入门 - 1. 安装Terraform
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • - 概述 - 《设计模式(极简c++版)》
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 双管齐下,VMware的容器新战略
  • 一些css基础学习笔记
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • ​ubuntu下安装kvm虚拟机
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (1)(1.11) SiK Radio v2(一)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (9)STL算法之逆转旋转
  • (C#)一个最简单的链表类
  • (C++20) consteval立即函数
  • (C语言)球球大作战
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (论文阅读30/100)Convolutional Pose Machines
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (七)理解angular中的module和injector,即依赖注入
  • (五)IO流之ByteArrayInput/OutputStream
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)