
package Day04;
import java.util.Arrays;
import java.util.Comparator;
public class methodReference1 {
public static void main(String[] args) {
//需求:创建一个数组,进行倒序排列
Integer[] arr={3,5,4,1,6,2};
//
//1、匿名内部类
Arrays.sort(arr,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for (Integer i : arr) {
System.out.print(i+",");
}
//lamdba表达式
//需求:创建一个数组,进行倒序排列
Integer[] arr1={3,5,4,1,6,2};
Arrays.sort(arr1,(Integer o1,Integer o2)->{return o2-o1;});
System.out.println(Arrays.toString(arr1));
//简写的lamdba表达式
Integer[] arr2={3,5,4,1,6,2};
Arrays.sort(arr2,(o1, o2)->o2-o1);
System.out.println(Arrays.toString(arr2));
//方法引用
//条件:
//1、引用处必须是函数式接口
//2、被引用的方法必须已经存在,如果引用的方法不存在,就需要自己编写
//3、被引用的形参和返回值需要和抽象方法的形参和返回值类型保持一致
//4、被引用的方法的功能需要满足当前的要求
Integer[] arr3={3,5,4,1,6,2};
//引用的方式是类名::静态方法
//注意看,这里是不要传参的,是把这个方法当作抽象方法的方法体
Arrays.sort(arr3,methodReference1::getstraction);
System.out.println(Arrays.toString(arr3));
}
public static int getstraction(int n1,int n2){
return n2-n1;
}
}

方法引用的分类:

1、引用静态方法
格式:类名::静态方法
示例:Integer::parseInt
package Day04;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class methodReference2 {
public static void main(String[] args) {
//String 集合中有如下数字,把他们变为int类型
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);
//如果使用匿名内部类,对比看,可能会清楚一点
list.stream()
.map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s);
}
});
}
}
被引用的形参和返回值需要和抽象方法的形参和返回值类型保持一致

2、引用成员方法
格式:对象::成员方法
分三种情况:
(1)其他类:其他类的对象::方法名称


(2)本类:this::方法名称
//需要特别注意:因为在static中没有this,所以在静态的main方法中是没有办法直接用this调用的
//你可以有两种方法:1、还是创建本类的对象,2、单独写一个非静态的方法,就可以用this::getstr了

(3)父类:super::方法名称
父类和本类其实是类似的
//需要特别注意:因为在static中没有this,所以在静态的main方法中是没有办法直接用this调用的 //你可以有两种方法:1、还是创建本类的对象,2、单独写一个非静态的方法,就可以用this::getstr了

所以,要注意,在本类或者父类中,你如果是用this或者是super引用方法,就说明这个时候这个方法是一个非静态的。那么就不能直接在psvm下面直接运行,你可以通过实现对象来获得最终效果。
3、引用构造方法
格式:类名::new
范例:Student::new
这里引用的构造方法一定要


package Day04;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class methodReference4 {
public static void main(String[] args) {
//集合中存有姓名和年龄,比如:张无忌,15
//将数据封装成student对象,并收集到List集合中
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张无忌,15","周芷若,16","灭绝师太,30","张三丰,100");
List<Student> collect = list.stream()
//.map(s->new Student(s.split(",")[0],Integer.parseInt(s.split(",")[1])))
.map(Student::new)
.collect(Collectors.toList());
System.out.println(collect);
}
}
package Day04;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String s) {
this.name=s.split(",")[0];
this.age=Integer.parseInt(s.split(",")[1]);
}
/**
* 获取
* @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 + "}";
}
}
4、其他的方法引用
4.1:类名引用成员方法


package Day04;
import java.util.ArrayList;
import java.util.Collections;
public class methodReference5 {
public static void main(String[] args) {
//集合中有一些英文字母,变成大写再输出
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c","d","e","f");
list.stream()
.map(String::toUpperCase)
.forEach(s-> System.out.print(s));
}
}
类名引用成员方法独有的:
1、需要有函数式接口
2、被引用的方法必须存在
3、被引用方法的形参需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致
4、被引用方法的功能需要满足当前的需求


4.2:引用数组的构造方法


package Day04;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class methodReference6 {
public static void main(String[] args) {
//集合中存储一些整数,并收集到数组中
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Integer[] array = list.stream()
.toArray(Integer[]::new);
for (Integer i : array) {
System.out.print(i);
}
}
}
方法引用总结:


方法引用的小练习:
练习1:
package Day04;
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class methodReference7 {
public static void main(String[] args) {
//集合中存储一些字符串的数据,比如"张三,23",
//收集到Students类型的数组中(方法引用)
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张三,23","李四,24","王五,25");
//引用Students的构造方法
Students[] array = list.stream()
.map(Students::new)
.toArray(Students[]::new);
for (Students students : array) {
System.out.println(
students.getName()+","+students.getAge()
);
}
}
}
练习2:
package Day04;
import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class methodReference8 {
public static void main(String[] args) {
//创建集合添加学生对象
//学生对象属性:name,age
//要求:获取姓名并且放在数组中(使用方法引用)
ArrayList<Students> list=new ArrayList<>();
Collections.addAll(list,new Students("张三",23),
new Students("李四",24),
new Students("王五",25));
String[] array = list.stream()
.map(Students::getName())
.toArray(String[]::new);
System.out.println(Arrays.toString(array));
}
}
练习3:

package Day04;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class methodReference9 {
public static void main(String[] args) {
//创建集合添加学生对象,学生的属性:姓名和年龄
//把姓名和年龄拼接成字符串,比如张三-23,并放到数组当中
ArrayList<Students> list=new ArrayList<>();
Collections.addAll(list,new Students("张三一",23),
new Students("李四二",24),
new Students("王五三",25));
String[] array = list.stream()
.map(Students::toString)
.toArray(String[]::new);
System.out.println(Arrays.toString(array));
}
}
