Supplier:
Suppler是一个生产型接口,此接口指定什么泛型,那么接口中的get方法就返回什么类型的数据

import java.util.function.Supplier;

public class Demo05SupplierTest {
    private static int getMax(Supplier<Integer> sup) {
        return sup.get();
    }

    public static void main(String[] args) {
        int[]arr = {100,50,200,66,38,88};
        int Max = getMax(()->{
            int max = arr[0];
            for (int i : arr) {
                if (max < i)
                    max = i;
            }
            return max;
        });

        System.out.println("最大值:"+Max);
    }
}

Consumer:
Consumer是一个消费型接口,此接口指定什么泛型,那么接口中的accept方法就返回什么类型的数据

import java.util.function.Consumer;

public class Demo02Consumer_Test {
    private static void getMessage(String[]arr, Consumer<String> con1 ,Consumer<String> con2){
        for (String s : arr) {
            con1.andThen(con2).accept(s);
        }
    }

    public static void main(String[] args) {
        String[]arr = {"hahaha,nv","xixixi,nv","dadada,nan"};

        getMessage(arr,(massage)->{
            String s1 = massage.split(",")[0];
            System.out.print("name:"+s1);
        },(messge)->{
            String s2 = messge.split(",")[1];
            System.out.println(",sex:"+s2);
        });
    }
}

Predicate
用于判断的方法,返回值是布尔值,有三种默认方法and(与), or(或), negate(非)

import java.util.function.Predicate;

public class Demo01Predicate {
    private static boolean chickStringLength(String s, Predicate<String> pre){
        return pre.test(s);
    }

    public static void main(String[] args) {
        String s1 = "sa;fasf";
        String s2 = "1fdfsa";

        boolean b = chickStringLength(s1,s -> s.contains("a"));
        boolean b1 = chickStringLength(s2,s -> s.length()>6);
        System.out.println(b+","+b1);
    }
}

Predicate的默认方法之and,把判断结果进行相与运算:

import java.util.function.Predicate;

public class Demo02Predicate_and {
    private static boolean chickString_and(String s, Predicate<String>pre1, Predicate<String>pre2){
        return pre1.and(pre2).test(s);  //等价于return pre1.test(s) && pre2.test(s);
    }

    public static void main(String[] args) {
        String s = "adfghjd";
        //lambda表达式
        boolean b = chickString_and(s,
                //判断长度是否大于6
                s1 -> s1.length()>6,
                //判断是否包括"a"
                s1 -> s1.contains("a") );
        System.out.println(b);  //输出两个判断结果的"与".
    }
}

另一个使用案例:

import java.util.ArrayList;
import java.util.function.Predicate;

//对给定的数组中的元素进行筛选,选出名字是4个字的女生
public class Predicate_test {
    private static ArrayList<String> filter(String[]arr, Predicate<String>pre1, Predicate<String> pre2){
        //创建一个新集合
        ArrayList<String> list = new ArrayList<>();
        //进行判断是否满足条件
        for (String s : arr) {
            boolean b = pre1.and(pre2).test(s);

            //如果满足条件
            if (b){
                list.add(s);
            }
        }
        //返回集合
        return list;
    }

    public static void main(String[] args) {
        //被筛选的字符串数组
        String[] arr = {"古力娜扎,女","迪丽热巴,女","ydaiq,女"};
        //调用Predicate_test方法
        ArrayList<String> list = filter(arr,
                //判断名字长度
                s -> s.split(",")[0].length() == 4,
                //判断性别
                s -> s.split(",")[1].equals("女"));

        //遍历list集合
        for (String s : list) {
            System.out.println(s);
        }
    }
}

//结果: 古力娜扎,女
//     迪丽热巴,女

Predicate的默认方法之or,把判断结果进行"或"运算:

import java.util.function.Predicate;

public class Demo03Predicate_or {
    private static boolean chinckString_or(String s, Predicate<String> pre1, Predicate<String> pre2){
        return pre1.or(pre2).test(s);   //等效于return pre1.test(s) || pre2.test(s);
    }

    public static void main(String[] args) {
        String s = "aadfghfsd";
        boolean b = chinckString_or(s,
                //判断是否长于6,
                s1 -> s1.length()>6,    //成立
                //判断是否包含"j"
                s1 -> s1.contains("j")); //不成立
        //只有一条成立,进行或运算结果为true所以输出true
        System.out.println(b);
    }
}

Predicate的默认方法之negate,把判断结果取"非":

import java.util.function.Predicate;

public class Demo04Predicate_negate {
    private static boolean chinckString_negate(String s, Predicate<String> pre) {
        return pre.negate().test(s);   //等效于return !pre1.test(s);
    }

    public static void main(String[] args) {
        String s = "aaaaaa";
        //对判断结果进行取反
        boolean b = chinckString_negate(s, s1 -> s1.contains("a"));
        //判断结果是true,所以输出false
        System.out.println(b);
    }
}

Function:
用于一个类型的数据转换为另一个类型,前者是前置条件,后者是后置条件.Function接口中主要的抽象方法是" apply ",使用场景,例如:将 String 类型转换为 Integer 类型.

import java.util.function.Function;

//Function的作用是数据类型的转换
public class Demo01Function {
    private static Integer change(String s , Function<String,Integer>fun){
        return fun.apply(s);
    }

    public static void main(String[] args) {
        String s = "123456";

        //调用change方法
        int in = change(s,s1 -> Integer.parseInt(s));
        System.out.println(in);  
        //结果:123456
    }
}

Function接口的另一个抽象方法 andthen ,该抽象方法用于拼接两个Function接口

import java.util.function.Function;

public class demo02Funcation_two_change {
    private static String change(String s, Function<String,Integer> fun1, Function<Integer,String> fun2){
        String ss = fun1.andThen(fun2).apply(s);
        return ss;
    }

    public static void main(String[] args) {
        String s = "123";

        String ss = change(s, (s1)->{return Integer.parseInt(s1) + 10;} ,(s2) -> { return s2+"";});
        System.out.println(ss);

        //简化lambda表达式
        String ss1 = change(s, s1 -> Integer.parseInt(s) + 20, s2 -> s2+"");
        System.out.println("简化的Lambda表达式:" + ss1);
        
        //输出结果:  133
        //          简化的Lambda表达式:143
    }
}

Function接口的抽象方法 andthen ,还能用于更多的接口的连接,下面给一个三个接口的例子:

import java.util.function.Function;
//先截取字符串的数字部分,后转换为Integer类型,然后把Integer类型的数字加100,最后定型为Integer.
public class demo03Function_three_change {
    private static Integer change(String s, Function<String,String> fun1,
                                  Function<String, Integer> fun2, Function<Integer,Integer> fun3){
        return fun1.andThen(fun2).andThen(fun3).apply(s);
    }

    public static void main(String[] args) {
        String s = "ydaiq,19";

        int in = change(s, s1 -> s.split(",")[1], s1 -> Integer.parseInt(s1), s1 -> s1 + 100);
        System.out.println(in);
    }
}