- 方法引用的规则:
- 需要有函数式接口
- 被引用的方法必须已经存在
- 被引用的方法的形参和返回值,需要跟抽象方法形参和返回值保持一致
- 被引用方法的功能需要满足当前的需求
- 引用类的方法:引用类的静态方法
- 格式:类名:静态方法
- 范例:Integer::parseInt
public static void main(String[] args) { //引用类方法,其实就是引用类的静态方法 ArrayList<String> list = new ArrayList<>(); Collections.addAll(list, "1","5","4","3","2"); //把他们变成int类型 /*list.stream().map(new Function<String, Integer>() { @Override public Integer apply(String s) { int i = Integer.parseInt(s); return i; } }).forEach(s -> System.out.println(s));*/ //类名::静态方法 list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s)); }
-
引用对象的实例方法
-
格式:对象::成员方法
-
例:
public static void main(String[] args) { //把字符串变成大写的数据,然后再控制台输出 ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"张无忌","赵敏","周芷若","张强","张三丰"); /*list.stream().filter(new Predicate<String>() { @Override public boolean test(String s) { return s.startsWith("张") && s.length() == 3; } }).forEach(s-> System.out.println(s));*/ /*list.stream().filter(s -> s.startsWith("张")&& s.length() == 3).forEach(s -> System.out.println(s)); list.stream().filter(new PrintString()::printOperation).forEach(s -> System.out.println(s));*/ //静态方法中没有this关键字,只能创建本类对象然后用对象调用本类静态方法 list.stream().filter(new FunctionDemo2()::printOperation).forEach(s -> System.out.println(s)); } public boolean printOperation(String s){ return s.startsWith("张")&& s.length() == 3; } public class PrintString { public void printUpper(String s){ String result = s.toUpperCase(); System.out.println(result); } public boolean printOperation(String s){ return s.startsWith("张")&& s.length() == 3; } }
-
-
引用成员方法
-
引用其他类的成员方法
-
对象::成员方法
-
-
引用本类的成员方法
-
this::成员方法(静态方法中没有this关键字,先创建本类对象再引用方法)
-
-
引用父类的成员方法
-
super::成员方法(静态方法中没有super关键字,先创建本类对象再引用方法)
-
-
-
引用构造方法
-
public class Student { private String name; private int age; //该有的空参和全参构造get和set方法 public Student(String str) { String[] arr = str.split(","); this.name = arr[0]; this.age = Integer.parseInt(arr[1]); } } public static void main(String[] args) { //引用构造方法 ArrayList<String> list = new ArrayList<>(); list.add("zhangsan,23"); list.add("lisi,24"); list.add("wangwu,25"); //不引用构造方法 List<Student> list1 = list.stream().map(new Function<String, Student>() { @Override public 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(list1); //引用构造方法 List<Student> list2 = list.stream().map(Student::new).collect(Collectors.toList()); System.out.println(list2); }
-
-
其他调用方法
-
使用类名引用成员方法
-
public static void main(String[] args) { //使用类名引用成员方法 //抽象方法形参详解 /* * 第一个参数:表示被引用的方法的调用者,决定了可以引用哪些类中的方法 * 在Stream流当中,第一个参数一般表示流里面的每一个数据。 * 鸡舍流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法 * * 第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明别引用的方法需要是无参的成员方法 * */ ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"aaa","bbb","ccc"); /*list.stream().map(new Function<String, String>() { @Override public String apply(String s) { return s.toUpperCase(); } }).forEach(s -> System.out.println(s));*/ list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s)); }
-
-
引用数组的构造方法
-
格式:数据类型[]::new
-
范例:int[] ::new
-
练习:集合中存储一些整数,收集到数组当中
-
public static void main(String[] args) { //将集合里面的数据收集到数组当中 ArrayList<Integer> list = new ArrayList<>(); Collections.addAll(list,1,2,3,4); Integer[] array = list.stream().toArray(Integer[]::new); //收集到集合当中 /*Integer[] array = list.stream().toArray(new IntFunction<Integer[]>() { @Override public Integer[] apply(int value) { return new Integer[value]; } });*/ System.out.println(Arrays.toString(array)); }
-
-
java中方法的引用
最新推荐文章于 2024-09-06 16:39:18 发布
文章详细介绍了Java中方法引用的规则,包括类的静态方法引用、对象的实例方法引用,以及引用构造方法和数组构造方法的方式。此外,还提到了如何在StreamAPI中使用方法引用优化代码。
摘要由CSDN通过智能技术生成