Java之方法引用
2023-12-16 21:28:48
目录
一、什么是方法引用
把已经有的方法拿过来,当做函数式接口中抽象方法的方法体。
Java的方法引用是一种新的语法,可以简化Lambda表达式的使用。方法引用可以将已有的方法作为Lambda表达式的替代进行传递。在Java中,方法引用使用双冒号(::)操作符来表示。
二、方法引用的规则
- 引用处必须是函数式接口
- 被引用的方法必须已经存在
- 被引用方法的形参和返回值需要跟抽象方法保持一致
- 被引用方法的功能要满足当前需求
三、方法引用的分类:
(一)、引用静态方法
格式:类名::静态方法
范例: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
特有规则:?
- 引用处必须是函数式接口
- 被引用的方法必须已经存在
- 被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致
- 被引用方法的功能要满足当前需求
抽象方法形参的详解:
- 第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法,在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));
文章来源:https://blog.csdn.net/lghlhg/article/details/135035084
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!