方法引用

news/2024/11/17 17:51:40/文章来源:https://www.cnblogs.com/Chengkai730/p/18436947

方法引用

方法: 就是以前学过的方法.

引用: 就是把已有的方法拿过来用.

如何用: 当做函数式接口抽象方法的方法体.

总结: 方法引用就是把已经有的方法拿过来用, 当做函数式接口中抽象方法的方法体.

方法引用的条件:

  1. 引用处必须是函数式接口.

  2. 被引用的方法必须是已经存在的.

  3. 被引用方法的形参和返回值必须和抽象方法保持一致.

  4. 被引用的方法的功能要能满足当前的要求.

:: 是方法引用符.

示例:

引用静态方法

格式: 类名::静态方法

范例: Integer::parseInt

程序示例:

import java.util.ArrayList;
import java.util.Collections;public class FunctionDemo2 {public static void main(String[] args) {/*方法引用(引用静态方法)格式类::方法名需求:集合中有以下数字,要求把他们都变成int类型"1","2","3","4","5"*/// 1.创建集合并添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "1", "2", "3", "4", "5");// 2.把他们都变成int类型/* list.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {int i = Integer.parseInt(s);return i;}}).forEach(s -> System.out.println(s));*/// 1.方法需要已经存在// 2.方法的形参和返回值需要跟抽象方法的形参和返回值保持一致// 3.方法的功能需要把形参的字符串转换成整数list.stream().map(Integer::parseInt).forEach(s -> System.out.println(s));}
}

引用成员方法

格式: 对象::成员方法

其他类: 其他类对象::方法名

本类: this::方法名

父类: super::方法名

程序示例:

import java.util.ArrayList;
import java.util.Collections;public class FunctionDemo3 {public static void main(String[] args) {/*方法引用(引用成员方法)格式其他类:其他类对象::方法名本类:this::方法名(引用处不能是静态方法)父类:super::方法名(引用处不能是静态方法)需求:集合中有一些名字,按照要求过滤数据数据:"张无忌","周芷若","赵敏","张强","张三丰"要求:只要以张开头,而且名字是3个字的*/// 1.创建集合ArrayList<String> list = new ArrayList<>();// 2.添加数据Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰");// 3.过滤数据(只要以张开头,而且名字是3个字的)// list.stream().filter(s->s.startsWith("张")).filter(s->s.length() == 3).forEach(s-> System.out.println(s));/*  list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张") && s.length() == 3;}}).forEach(s-> System.out.println(s));*//*  StringOperation so = new StringOperation();list.stream().filter(so::stringJudge).forEach(s-> System.out.println(s));*/// 静态方法中是没有this的list.stream().filter(new FunctionDemo3()::stringJudge).forEach(s -> System.out.println(s));}public boolean stringJudge(String s) {return s.startsWith("张") && s.length() == 3;}
}
public class StringOperation {public boolean stringJudge(String s){return s.startsWith("张") && s.length() == 3;}
}

程序示例:

public class App {public static void main(String[] args) {new LoginJFrame();}
}
import javax.swing.*;
import java.awt.*;public class LoginJFrame extends MyJFrame {JButton go = new JButton("Go");public LoginJFrame() {// 设置图标setIconImage(Toolkit.getDefaultToolkit().getImage("myfunction\\image\\logo.jpg"));// 设置界面initJframe();// 添加组件initView();// 界面显示出来this.setVisible(true);}// 添加组件public void initView() {JLabel image = new JLabel(new ImageIcon("myfunction\\image\\kit.jpg"));image.setBounds(100, 50, 174, 174);this.getContentPane().add(image);go.setFont(new Font(null, 1, 20));go.setBounds(120, 274, 150, 50);go.setBackground(Color.WHITE);go.addActionListener(super::method1);this.getContentPane().add(go);}// 设置界面public void initJframe() {// 设置标题this.setTitle("随机点名器");// 设置大小this.setSize(400, 500);// 设置关闭模式this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口无法进行调节this.setResizable(false);// 界面居中this.setLocationRelativeTo(null);// 取消内部默认居中放置this.setLayout(null);// 设置背景颜色this.getContentPane().setBackground(Color.white);this.setAlwaysOnTop(true);  // 置顶}
}
import javax.swing.*;
import java.awt.event.ActionEvent;public class MyJFrame extends JFrame {public void method1(ActionEvent e) {System.out.println("go按钮被点击了");}
}

引用构造方法

格式: 类名::new
范例: Student::new

程序示例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;public class FunctionDemo4 {public static void main(String[] args) {/*方法引用(引用构造方法)格式类名::new目的:创建这个类的对象需求:集合里面存储姓名和年龄,要求封装成Student对象并收集到List集合中方法引用的规则:1.需要有函数式接口2.被引用的方法必须已经存在3.被引用方法的形参和返回值,需要跟抽象方法的形参返回值保持一致4.被引用方法的功能需要满足当前的需求*/// 1.创建集合对象ArrayList<String> list = new ArrayList<>();// 2.添加数据Collections.addAll(list, "张无忌,15", "周芷若,14", "赵敏,13", "张强,20", "张三丰,100", "张翠山,40", "张良,35", "王二麻子,37", "谢广坤,41");// 3.封装成Student对象并收集到List集合中// String --> Student/*  List<Student> newList = list.stream().map(new Function<String, Student>() {@Overridepublic Student apply(String s) {String[] arr = s.split(",");String name = arr[0];int age = Integer.parseInt(arr[1]);return new Student(name, age);}}).collect(Collectors.toList());System.out.println(newList);*/List<Student> newList2 = list.stream().map(Student::new).collect(Collectors.toList());System.out.println(newList2);}
}
public class Student {private String name;private int age;public Student() {}public Student(String str) {String[] arr = str.split(",");this.name = arr[0];this.age = Integer.parseInt(arr[1]);}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}

使用类名引用成员方法

格式: 类名::成员方法

范例: String::substring

程序示例:

import java.util.ArrayList;
import java.util.Collections;public class FunctionDemo5 {public static void main(String[] args) {/*方法引用(类名引用成员方法)格式类名::成员方法需求:集合里面一些字符串,要求变成大写后进行输出方法引用的规则:1.需要有函数式接口2.被引用的方法必须已经存在3.被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致。4.被引用方法的功能需要满足当前的需求抽象方法形参的详解:第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法在Stream流当中,第一个参数一般都表示流里面的每一个数据。假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法局限性:不能引用所有类中的成员方法。是跟抽象方法的第一个参数有关,这个参数是什么类型的,那么就只能引用这个类中的方法。*/// 1.创建集合对象ArrayList<String> list = new ArrayList<>();// 2.添加数据Collections.addAll(list, "aaa", "bbb", "ccc", "ddd");// 3.变成大写后进行输出// map(String::toUpperCase)// 拿着流里面的每一个数据,去调用String类中的toUpperCase方法,方法的返回值就是转换之后的结果。list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));// String --> String/* list.stream().map(new Function<String, String>() {@Overridepublic String apply(String s) {return s.toUpperCase();}}).forEach(s -> System.out.println(s));*/}
}

引用数组的构造方法

格式: 数据类型[]:new

范例: int[]::new

程序示例:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;public class FunctionDemo6 {public static void main(String[] args) {/*方法引用(数组的构造方法)格式数据类型[]::new目的:创建一个指定类型的数组需求:集合中存储一些整数,收集到数组当中细节:数组的类型,需要跟流中数据的类型保持一致。*///1.创建集合并添加元素ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list, 1, 2, 3, 4, 5);//2.收集到数组当中Integer[] arr2 = list.stream().toArray(Integer[]::new);System.out.println(Arrays.toString(arr2));/*Integer[] arr = list.stream().toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});*///3.打印}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一次搞定30天账单,花了十分钟记账

一次搞定30天账单,花了十分钟记账 丑话在前:早出晚归忙奔波,挣钱如针挑土,花钱如水冲沙。挣一毛花十分,一分一厘不容易,开源节流铁公鸡。本教程适用于有复式记账基础的个人,由企业财务系统精简编制的模板,苹果设备 iphone\macbook 请使用 numbers 应用,或使用网页登录…

15 json常见操作与案例 序列化 反序列化

json:本质是一个特定结构的字符串 意义 :打通不同编程语言之间进行相互通信 时的数据格式问题。序列化(python数据类型 转换成 JSON格式化字符串)# python数据类型 转换成 JSON格式化字符串 序列化 import json # python数据类型 info = {"code": 1000, &quo…

16 JSON 爬虫【反序列化】豆瓣

# 没有安装 requests模块 ,需要安装此模块 pip3 install requests import json import requestsres=requests.get(url=https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0,headers={User-Agent:Mozilla/5.…

19 导入模块成员冲突 总结

成员和冲突 #如果导入的方法存在冲突时,进行取别名 import db as d1 from utils.db import db as d2 #也支持下面的方法导入 from utils.db import x1,x3,x3 from utils.db import * #此方式不推荐 def run():d1.f1()d1.f2()d2.xxx() if __name__ == "__main__":run…

一站式解决方案:10款PM工程项目管理软件深度解析

市面上主流的 10 款PM工程项目管理系统推荐:PingCode、Worktile、飞书、金和项目管理、致远协同办公、Asana、Trello、JIRA、Basecamp、Monday.com。在现代企业管理中,项目的复杂性常常让人感到无从应对,错失进度和预算控制的情况屡见不鲜。选择合适的PM工程项目管理系统,不…

09 模块导入规则 寻找模块 常见问题

模块导入规则 在python内部导入模块时,必须要遵循他的规则,必须去指定的目录中找py文件。 寻找模块一般就三个位置优先在当前运行脚本的同级目录 【一般问题比较多】python的安装目录 【内置模块】python的安装目录+site-packages 【第三方模块】…

WiFi基础(五):802.11帧结构与WiFi控制帧、管理帧、数据帧

802.11 无线 WiFi 有 数据帧,管理帧、控制帧 三种类型帧。这些帧由 9 个部分组成:Frame Control,Duration ID,Address1,Address2,Address3,Seq-ctl,Address4,Frame Body,FCS。需要注意的是,有些组成部分在有些帧里并不是必须的。liwen01 2024.09.22 前言 前面介绍了…

第15课

おきます つくります うります 知ります

产品架构图怎么做才能抓住眼球

产品架构图怎么做才能抓住眼球,即使应用在可视化大屏也不枯燥

02 使用配置文件+反射实现

使用配置文件+反射实现需要遵守:开放封闭原则开放,针对配置开放 封闭,针对功能代码目录结构 unicom- app.py- settings.py- utils - sms.py- wechat.py#seetings.py里面代码 MESSAGE_LIST =["utils.sms.send","utils.wechat.send" ] #sms.py def send(m…

读数据湖仓02数据抽象

数据抽象1. 不同类型的数据 1.1. 不同类型的数据在存储方面有各自的特性,这些特性极大地影响了数据在数据湖仓中的存储和使用方式 1.2. 结构化数据1.2.1. 在企业等组织中,只有少量的数据是结构化数据1.2.2. 结构化数据是基于事务的数据,是组织日常业务的副产品1.3. 文本数据…

结对项目-实现一个自动生成小学四则运算题目的命令行程序

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里 结对项目 - 作业 - 计科22级34班 - 班级博客 - 博客园 (cnblogs.com)这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序成员 3122004742 李思危3122004754 许佳钒github…