方法引用知识
一.方法引用概述
方法引用
把已经有的方法拿过来引用,当做函数式接口中抽象方法的方法体
要求:
- 引用处必须是函数式接口
- 被引用的方法必须已经存在
- 被引用方法的形参与返回值需要跟抽象方法保持一致
- 被引用方法的功能要满足当前需求
public static void main(String[] args){//需求:创建一个数组,进行倒序排序Integer[] arr={3,4,5,1,6,2};//匿名内部类Arrays.sort(arr,new Comparator<Integer>(){@Overridepublic int compare(Integer o1, Integer o2){return o2-o1;}
});//lambda表达式//因为第二个参数的类型Comparator是一个函数式接口Arrays.sort(arr,(Integer o1,Integer o2)->{return o2-o1;
});//lambda表达式简化格式Arrays.sort(arr,(o1,o2)->o2-o1);//方法引用//1.引用处需要是函数式接口//2.被引用的方法需要已经存在//3.被引用方法的形参和返回值需要和抽象方法的形参与返回值保持一致//4.被引用方法的功能需要满足当前的需求//表示引用FunctionDemo1类里面的subtraction方法//把这个方法当做抽象方法的方法体Arrays.sort(arr,FunctionDemo1::subtraction);}//可以是Java已经写好的,也可以是一些第三方的工具类
public static int subtraction(int num1, int num2){return num2-num1;
}}
二.引用静态方法
格式: 类名::静态方法
范例:Integer::parseInt
//需求: 集合中有以下数字,要求把他们转换为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));//或者使用方法引用
list.stream().map(Integer::parseInt).forEach(s->System.out.println(s));
三.引用成员方法
格式: 对象::成员方法
- 其它类: 其它类对象:: 方法名
- 本类:this::方法名(需要在非静态方法中)
- 父类:super::方法名(需要在非静态方法中)
StringOperation so=new StringOperation();
list.stream().filter(so::stringJudge).forEach(s->System.out.println(S));
四.引用构造方法
格式:类名::new
范例: student:: new
练习:
集合里面存储姓名和年龄,比如:张无忌,15 要求:将数据封装成Student对象并收集到List集合中
import java.util.*;
import java.lang.String;
import java.util.function.Function;
import java.util.stream.Stream;public class main {public static void main(String[] args) {ArrayList<String> arr = new ArrayList<>();Collections.addAll(arr,"张无忌,15","周芷若,14","赵敏,13", "张强,20", "张三丰,100", "张翠山,40", "张良,35", "王二麻子,37" );arr.stream().map(new Function<String, Actor>() {@Overridepublic Actor apply(String s) {return new Actor(s.split(",")[0], Integer.parseInt(s.split(",")[1]));}}).forEach(a-> System.out.println(a));}}
转变为下述(Actor)
public class Actor {private String name;private int age;public Actor() {}public Actor(String str) {this.name = str.split(",")[0];this.age = Integer.parseInt(str.split(",")[1]);}public Actor(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 "Actor{name = " + name + ", age = " + age + "}";}
}
main
import java.util.*;
import java.lang.String;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class main {public static void main(String[] args) {ArrayList<String> arr = new ArrayList<>();Collections.addAll(arr,"张无忌,15","周芷若,14","赵敏,13", "张强,20", "张三丰,100", "张翠山,40", "张良,35", "王二麻子,37" );arr.stream().map(Actor::new).collect(Collectors.toList()).forEach(a-> System.out.println(a)); } }
五.使用类名引用成员方法
格式:类名::成员方法
范例:String::substring
练习:集合里面一些字符串,要求变成大写后进行输出
import java.util.*;
import java.lang.String;public class main {public static void main(String[] args) {ArrayList<String> arr = new ArrayList<>();Collections.addAll(arr,"aaa","bbb","ccc","ddd");
// arr.stream().map(new Function<String, String>() {
// @Override
// public String apply(String s) {
// return s.toUpperCase();
// }
// }).forEach(a-> System.out.println(a));arr.stream().map(String::toUpperCase).forEach(a-> System.out.println(a));}}
六.引用数组的构造方法
格式: 数据类型[]::new
范例: int[]::new
练习:集合中存储一些整数,收集到数组当中
import java.util.*;
import java.lang.String;
import java.util.function.IntFunction;public class main {public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();Collections.addAll(arr,1,2,3,4,5,6);
// Integer[] integers = arr.stream().toArray(new IntFunction<Integer[]>() {
// @Override
// public Integer[] apply(int value) {
// return new Integer[value];
// }
// });
// System.out.println(Arrays.toString(integers));Integer[] integers = arr.stream().toArray(Integer[]::new);System.out.println(Arrays.toString(integers));}}