import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

public class FunctionDemo1 {
    public static void main(String[] args) {
        //需求:创建一个数组,倒序排列
        Integer[] arr={1,2,3,4,5,6};
        //1.匿名内部类
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        //2.lambda表达式
        Arrays.sort(arr,(o1,o2)->o2-o1);

        //3.方法引用
        //(1)引用处需要是函数式接口
        //(2)被引用的方法需要已存在
        //(3)被引用方法的形参和返回值需要和抽象方法保持一致
        //(4)被引用方法的功能需要满足当前要求

        //表示引用FunctionDemo1类里的subtraction方法
        //把这个方法当作抽象方法的方法体
        Arrays.sort(arr,FunctionDemo1::subtraction);
        System.out.println(Arrays.toString(arr));
    }
    //方法可以是Java写好的方法,也可以是第三方的工具类
    public static int subtraction(int a,int b){
        return b-a;
    }
}
----------------------------------
public class FunctionDemo2 {
    public static void main(String[] args) {
        //引用静态方法

        //需求:把集合中的字符串变为int类型
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "1", "2", "3", "4", "5");

        List<Integer> list1 = list.stream().map(Integer::parseInt).collect(Collectors.toList());
        System.out.println(list1);
    }
}
-------------------------------------------
public class StringOperation {
     public boolean isName(String name){
        return name.startsWith("z") && name.length()>=1;
    }
}
-----
public class FunctionDemo3 {
    public static void main(String[] args) {
     /*
     成员方法引用
     作为函数式接口
     格式:
     其他类  其他类成员对象::成员方法
     本类   this::成员方法
     父类   super::成员方法
     静态中没有this和super
      */

        ArrayList<String> list = new ArrayList<>();
        list.add("zhangsan");
        list.add("lisi");
        list.add("wangwu");
        list.add("zhaoliu");
        list.add("tianqi");
        list.add("xiaohong");
        //其他类
        list.stream().filter(new StringOperation()::isName).forEach(System.out::println);
    }

}
-------------------------------
public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student(String str){
        this.name=str.split(",")[0];
        this.age=Integer.parseInt(str.split(",")[1]);
    }
    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}
-----
public class FunctionDemo4 {
    public static void main(String[] args) {
        /*
        引用构造方法
        格式:
            类名::new
            创建这个类对象

         方法引用规则:
         1.需要有函数式接口
         2.被引用的方法必须已存在
         3.被引用的方法的形参和返回值必须要和抽象方法的形参和返回值保持一致
         4.被引用方法的功能需要满足当前要求
         */
        //将字符串封装成学生对象,存储到lsit集合中
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "zhangsan,23", "lisi,24", "wangwu,25");

        List<Student> list1 = list.stream().map(Student::new).collect(Collectors.toList());//此处需要在student中创建方法使得形参是String类型,返回值是Student类型
        System.out.println(list1);
    }
}
------------------------------
public class FunctionDemo5 {
    public static void main(String[] args) {
        //引用数组的构造方法
        /*
        格式:
        数据类型[]::new
        目的:创建一个指定类型的数组
         */
        ArrayList<Integer> list=new ArrayList<>();
        Collections.addAll(list,1,2,3,4,5,6);
        //list.stream().toArray(value->new Integer[value]);
        Integer[] arr = list.stream().toArray(Integer[]::new);
        System.out.println(Arrays.toString(arr));
    }
}