java常见的函数式接口:Supplier接口,Consumer接口,Predicate接口,Function接口,以及接口常用方法,接口练习。

1、Supplier接口

java.util.function.Supplier接口仅包含一个无参的方法:T get( )。用来获取一个泛型参数指定类型的对象数据。

Supplier接口被称之为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据。
用法:

import java.util.function.Supplier;

public class Demo01Supplier {
    
    
    public static String getString(Supplier<String> sup){
    
    
        return sup.get();
    }

    public static void main(String[] args) {
    
    
        String s = getString(() -> {
    
    
            return "胡戈";
        });
        System.out.println(s);

        //优化
        String s2 = getString(()->"胡戈");
        System.out.println(s2);
    }
}

2、Supplier接口练习——求数组元素最大值

练习:求数组元素最大值
使用Supplier接口作为方法参数类型,通过Lambda表达式求出int数组中的最大值。
提示:接口的泛型使用java.lang.Integer类。

代码实现:

import java.util.function.Supplier;

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

    public static void main(String[] args) {
    
    
        int[] arr = {
    
    100, 23, 98, 43, 56, 58, 145, 177 };
        int m = getMax(() -> {
    
    
            int max = arr[0];
            for (int i = 1; i < arr.length; i++) {
    
    
                if (arr[i] > max) {
    
    
                    max = arr[i];
                }
            }
            return max;
        });
        System.out.println(m);
    }
}

3、Consumer接口

java.util.function.Consumer接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。
Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据。

Consumer接口是一个消费型接口,泛型执行指定什么类型,就可以使用accept方法消费什么类型的数据。至于具体怎么消费(使用),需要自定义(输出,计算…)。

用法实现:

import java.util.function.Consumer;

public class Demo03Consumer {
    
    
    public static void method(String name, Consumer<String> con){
    
    
        con.accept(name);
    }

    public static void main(String[] args) {
    
    
        method("张大伟",(String name)->{
    
    
           // System.out.println(name);  //张大伟
            String reName = new StringBuffer(name).reverse().toString();
            System.out.println(reName);  //伟大张
        });
    }
}

4、Consumer接口默认方法andThen

Consumer接口的默认方法andThen
作用:需要两个Consumer接口,可以把两个Consumer接口组合到一起再对数据进行消费。
实现代码:

import java.util.function.Consumer;

public class Demo04andThen {
    
    
    public static void method(String s, Consumer<String> con1, Consumer<String> con2){
    
    
        con1.andThen(con2).accept(s);
    }

    public static void main(String[] args) {
    
    
        method("HelloWorld",
                (t)->{
    
    
                    System.out.println(t.toUpperCase()); //HELLOWORLD
                },
                (t)->{
    
    
                    System.out.println(t.toLowerCase()); //helloworld
        });
    }
}

5、Consumer接口练习——字符串拼接

import java.util.function.Consumer;

public class Demo05ConsumerTest {
    
    
    public static void method(String[] arr, Consumer<String> con1, Consumer<String> con2){
    
    
        for (String message : arr) {
    
    
            con1.andThen(con2).accept(message);
        }
    }

    public static void main(String[] args) {
    
    
        String[] arr = {
    
    "迪丽热巴,女", "古力娜扎,女", "玛尔扎哈,男"};

        method(arr,(message)->{
    
    
            String name = message.split(",")[0];
            System.out.print("姓名:" + name);
        },(message)->{
    
    
            String age = message.split(",")[1];
            System.out.println("。年龄:" + age);
        });
    }
}

6、Predicate接口

有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用java.util.function.Predicate接口。
Predicate接口中包含一个抽象方法:
boolean test(T t):用来对指定数据类型数据进行判断的方法
结果:
符合条件:返回true
不符合条件:返回false

用法代码展示:

import java.util.function.Predicate;

public class Demo06Predicate {
    
    

    public static boolean checkString(String s, Predicate<String> pre){
    
    
        boolean b = pre.test(s);
        return b;
    }

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

        boolean b = checkString(s,(String str)->{
    
    
            //对参数传递的字符串进行判断,判断长度是否大于5,并把判断的结果返回
            return str.length()>5;
        });
        System.out.println(b);
    }
}

7、Predicate接口默认方法and

import java.util.function.Predicate;

public class Demo07PredicateAnd {
    
    
    public static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2){
    
    
        return pre1.and(pre2).test(s);
    }

    public static void main(String[] args) {
    
    
        String s = "awdafsd";
        boolean b = checkString(s, (String str) -> {
    
    
            return str.length()>5;
        }, (String str) -> {
    
    
            return str.contains("a");
        });
        System.out.println(b);
    }
}

and为“且”的意思,or和negate为“或者”和“非”的意思。

8、Predicate接口练习——集合信息筛选

数组当中有多条姓名+性别的信息如下,请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,需要满足以下两个条件:
1、必须为女生
2、姓名为四个字。
代码实现:

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

public class Demo08PredicateTest {
    
    
    public static ArrayList<String> checkString(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 = {
    
    "迪丽热巴,女", "古力娜扎,女", "玛玛哈哈,男", "张伟,男"};
        ArrayList<String> list = checkString(arr,(String str)->{
    
    
            return str.split(",")[0].length()==4;
        },(String str)->{
    
    
            return str.split(",")[1].equals("女");
        });
        System.out.println(list);
    }
}

9、Function接口

java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据,前者为前置条件,后者为后置条件。
Fucntion接口中最主要的抽象方法为R apply(T t),根据类型T的参数获取类型R的结果。
代码实现:

import java.util.function.Function;

public class Demo09Function {
    
    
    public static void change(String s, Function<String, Integer> fun){
    
    
        Integer in = fun.apply(s);
        System.out.println(in);
    }

    public static void main(String[] args) {
    
    
        String s = "23231";
        change(s,(String str)->{
    
    
            return Integer.parseInt(str);
        });
    }
}

10、Function接口的默认方法andThen

Function接口中的默认方法andThen用来进行组合操作

需求:
把String类型的“123"转换为Integer类型,把转换后的结果加上10
把增加之后的Integer类型数据转换为String类型

分析:
转换了两次,
第一次是把String类型转换为了Integer类型,
所以可以使用Function<String,Integer> fun1
Integer i = fun1.apply(“123”) + 10;
第二次是把Integer类型转换为了String类型,
所以可以使用Function<Integer,String> fun2
String s = fun2.apply(i);

我们可以使用andThen方法把两次转换组合在一起使用
String s = fun1.andThen(fun2).apply(“123”);

代码实现:

import java.util.function.Function;

public class Demo10FunctionApply {
    
    
    public static void change(String s, Function<String,Integer> fun1, Function<Integer, String> fun2){
    
    
        String ss = fun1.andThen(fun2).apply(s);
        System.out.println(ss);
    }

    public static void main(String[] args) {
    
    
        String s = "2324";
        change(s,(String str)->{
    
    
            return Integer.parseInt(str) + 10;
        },(Integer i)->{
    
    
            return i + "";
        });
    }
}

11、Function接口练习——自定义函数模型拼接

练习:自定义函数模型拼接
题目
请使用Function进行函数模型的拼接,按照顺序需要执行的多个函数操作为:
String str = “赵丽颖,20”;
1、将字符串截取数字年龄部分,得到新的字符串
2、将上一步的字符串转换为int类型的数字
3、将上一步的int数字累加100,得到结果int数字。

代码实现:

import java.util.function.Function;

public class Demo11FunctionTest {
    
    
    public static void change(String s, Function<String, String> fun1,
                              Function<String, Integer> fun2,
                              Function<Integer,Integer> fun3){
    
    
        Integer i = fun1.andThen(fun2).andThen(fun3).apply(s);
        System.out.println(i);
    }

    public static void main(String[] args) {
    
    
        String s = "赵丽颖,21";
        change(s,(String str)->{
    
    
            return str.split(",")[1];
        },(String str)->{
    
    
            return Integer.parseInt(str);
        },(Integer i)->{
    
    
            return i + 100;
        });
    }
}

猜你喜欢

转载自blog.csdn.net/Gaoju12138/article/details/114294568