天天看点

Java8函数式接口Function、Consumer、Predicate、Supplier的使用

Java8函数式接口Function、Consumer、Predicate、Supplier

1. java8中函数接口的种类:

Java8函数式接口Function、Consumer、Predicate、Supplier的使用

2. function型函数式接口

Function接口 接受一个输入参数T,返回一个结果R。

function的源码
@FunctionalInterface
public interface Function<T, R> {
    // 接受输入参数,对输入执行所需操作后  返回一个结果。
    R apply(T t);
    // 返回一个 先执行before函数对象apply方法,再执行当前函数对象apply方法的 函数对象。
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
       Objects.requireNonNull(before);
       return (V v) -> apply(before.apply(v));
    }

    // 返回一个 先执行当前函数对象apply方法, 再执行after函数对象apply方法的 函数对象。
    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }   

    // 返回一个执行了apply()方法之后只会返回输入参数的函数对象。
    static <T> Function<T, T> identity() {
        return t -> t;
    } 
           

示例:

static int modifyTheValue(int valueTobeOperated, Function<Integer, Integer> function) {
            return function.apply(valueTobeOperated);
        }
    
    
    	int myNumber = 10;

        // 使用lambda表达式实现函数式接口
        // (x)->(x)+20 输入一个参数x,进行加法运算,返回一个结果
        // 所以该lambda表达式可以实现Function接口
        int resl = modifyTheValue(myNumber, (x) -> x + 20);
        System.out.println(resl);


        //使用匿名内部类
        int res2 = modifyTheValue(myNumber, new Function<Integer, Integer>() {
            @Override
            public Integer apply(Integer integer) {
                return integer + 20;
            }
        });
        System.out.println(res2);
           

3. Consumer 函数式接口

接受一个输入参数并且无返回的操作

static void modifyTheValue3(int value, Consumer<Integer> consumer) {
        consumer.accept(value);
    }
    
    @Test
    public void consumerTest()
    {
        // (x) -> System.out.println(x * 2)接受一个输入参数x
        // 直接输出,并没有返回结果
        // 所以该lambda表达式可以实现Consumer接口
        modifyTheValue3(3, (x) -> System.out.println(x * 2));

    }
}



           

4.Predicate函数式接口

接受一个输入参数,返回一个布尔值结果。

public static boolean predicateTest(int value, Predicate<Integer> predicate) {
        return predicate.test(value);
    }

    @Test
    public void prdTest() {
        // (x) -> x == 3 输入一个参数x,进行比较操作,返回一个布尔值
        // 所以该lambda表达式可以实现Predicate接口
        System.out.println(predicateTest(3, x -> x == 3));
    }
    

public static void eval(List<Integer> list, Predicate<Integer> predicate) {
        for (Integer n : list) {
            if (predicate.test(n)) {
                System.out.print(n + " ");
            }
        }

    }

    @Test
    public void predtest2() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // Predicate<Integer> predicate = n -> true
        // n 是一个参数传递到 Predicate 接口的 test 方法
        // n 如果存在则 test 方法返回 true
        System.out.println("输出所有值:");
        eval(list, n -> true);
        
        // Predicate<Integer> predicate2 = n -> n > 3
        // n 是一个参数传递到 Predicate 接口的 test 方法
        // 如果 n 大于 3 test 方法返回 true
        System.out.println("\n输出大于 3 的所有数字:");
        eval(list, n -> n > 3);
    }
           

5. Supplier供给型函数式接口

无参数,返回一个结果。

static String supplierTest(Supplier<String> supplier) {
        return supplier.get();
        }


    @Test
    public void supplier() {
        String name = "冷冷";
        // () -> name.length() 无参数,返回一个结果(字符串长度)
        // 所以该lambda表达式可以实现Supplier接口
        System.out.println(supplierTest(() -> name.length()+""));

    }
           

6. Lambda及函数式接口的例子

Java8函数式接口Function、Consumer、Predicate、Supplier的使用

参考链接:https://blog.csdn.net/z834410038/article/details/77370785