1、引用方法是什么?
将现有的方法作为函数接口中抽象方法的方法体使用。
2、什么时候可以用方法引用?①、引用处需要函数接口
②、可引用的函数必须满足以下条件:
a、引用的方法必须已经存在
b、引用方法的形参和返回值应与抽象方法保持一致
c、引用的方法需要满足当前的功能
测试代码如下所示:
import java.util.Arrays;import java.util.Comparator;public class Test { public static void main(String[] args) { Integer[] arr1 = new Integer[]{1, 3, 4, 7, 89, 45, 33, 11, 44, 66}; Integer[] arr2 = new Integer[]{1, 3, 4, 7, 89, 45, 33, 11, 44, 66}; Arrays.sort(arr1, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return Integer.compare(o1, o2); } }); System.out.println(Arrays.toString(arr1); ///使用方法引用数据排序 Arrays.sort(arr2,Test::myCompare); System.out.println(Arrays.toString(arr1); } ///写一个可以引用的方法 public static int myCompare(Integer o1, Integer o2){ return Integer.compare(o1, o2); }}
3、方法引用的分类(包括引用其他类别的成员方法、引用这类成员方法和引用父类成员方法)①、引用静态方法
②、引用成员方法
③、引用结构方法
3.1、引用静态方法:
格式:类名::静态方法
需求:如果集合中有以下数字(“1”、“2”、“3”、“4”、“5”),则需要将其转换为int类型(提示:流中的数据类型需要转换,即map)
import java.util.ArrayList;import java.util.Collections;import java.util.function.Function;public class Question1 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list, "1", "2", "3", "4", "5"); ///使用流修改数据类型 list.stream().map(new Function<String, Integer>() { @Override public Integer apply(String s) { return Integer.parseInt(s); } }).forEach( n -> System.out.print(n + " ") ); System.out.println("\n------------------------------"); ////直接调用现成的方法 list.stream().map(Integer::parseInt).forEach(n -> System.out.print(n + " ")); }}
3.2、引用成员方法
引用普通成员函数:
///使用方法引用Arrays排序数据.sort(arr2,new Test()::myCompare);//创建对象,然后使用::调用System.out.println(Arrays.toString(arr1);
注:thiss不能用于静态方法::由于静态方法中没有this关键字,方法名称被引用到方法中。
3.3、引用结构方法
格式:类名::new
需求:集中存储:周芷若-男-20", "王二麻子-女-23", "赵敏-女-22", "王富贵-男-30", "张强-男-14", "张三丰-男-19", "张举-男-23", "张良-女-25", "王镪-男-21", "王强-男-21"请将这些数据放入Person集中(如果Person属性有姓名和年龄)。
///Person类public class Person { private String name; private int age; public Person() { } ///需要重写此方法 Person(String str){ this.name = str.split("-")[0]; this.age = Integer.parseInt(str.split("-")[2]); } public Person(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 "Person{name = " + name + ", age = " + age + "}"; }}//测试import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.function.Function;import java.util.stream.Collectors;public class Question2 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list, "周芷若-男-20", "王二麻子-女-23", "赵敏-女-22", "王富贵-男-30", "张强-男-14", "张三丰-男-19", "张举-男-23", "张良-女-25", "王镪-男-21", "王强-男-21"); final List<Person> collect1 = list.stream().map(new Function<String, Person>() { @Override public Person apply(String s) { String name = s.split("-")[0]; int age = Integer.parseInt(s.split("-")[2]); return new Person(name, age); } }).collect(Collectors.toList()); System.out.println(collect1); ///引用结构方法,为了满足引用方法的条件,需要在类中添加结构方法 final List<Person> collect2 = list.stream().map(Person::new).collect(Collectors.toList()); System.out.println(collect2); }}