其他分享
首页 > 其他分享> > 函数式接口:Supplier与Consumer

函数式接口:Supplier与Consumer

作者:互联网

Supplier接口

Supplier在英文中的意思:供应商。
指提供某种产品。编程中一般认为是生成某种类型的数据。

jdk源码

package java.util.function;

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

除了一个抽象方法以外,并没有其它的方法

我们来看看这个接口的一种经典用法

代码样例

public class Main {
     public static void main(String[] args) {
        int nums[] = {1, 23, 135, 534, 6245, 16254, 3547345};
        Integer res = test(() -> {
            int max = -1;
            for (int num : nums) {
                max = Math.max(max, num);
            }
            return max;
        });
        System.out.println("最大值:" + res);
    }
    public static <T> T test(Supplier<T> s) {
        return s.get();
    }
}

执行结果

最大值:3547345

消费型接口:

Consumer接口

Consumer在英文中的意思:消费者。
指消费某种产品。编程中一般认为是使用某种类型的数据。

jdk源码

package java.util.function;

import java.util.Objects;

@FunctionalInterface
public interface Consumer<T> {
    void accept(T var1);

    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (t) -> {
            this.accept(t);
            after.accept(t);
        };
    }
}

除了一个抽象方法以外,还有一个andThen方法。

我们来看看这个接口的一种经典用法。

// 格式化打印
public class Main {
     public static void main(String[] args) {
        String strs[] = {"张三 男", "李四 男", "小红 女"};
        test(strs, (arr) -> {
            for (String str : arr) {
                String s[] = str.split(" ");
                System.out.println(s[0] + ":" + s[1]);
            }
        });
    }
    public static <T> void test(T t, Consumer<T> c) {
        c.accept(t);
    }
}

执行结果

张三:男
李四:男
小红:女

当想将上面的数据正向与逆向输出两遍怎么办?

// 正向与逆向格式化打印
public class Main {
     public static void main(String[] args) {
        String strs[] = {"张三 男", "李四 男", "小红 女"};
        test(strs, (arr) -> {
            System.out.println("------正序输出------");
            for (String str : arr) {
                String s[] = str.split(" ");
                System.out.println(s[0] + ":" + s[1]);
            }
        });
        test(strs, (arr) -> {
            System.out.println("------逆序输出------");
            for (int i = arr.length - 1; i >= 0; i --) {
                String s[] = arr[i].split(" ");
                System.out.println(s[0] + ":" + s[1]);
            }
        });
    }
    public static <T> void test(T t, Consumer<T> c) {
        c.accept(t);
    }
}

执行结果

------正序输出------
张三:男
李四:男
小红:女
------逆序输出------
小红:女
李四:男
张三:男

好像没有什么问题,这是代码量有点大。

如果我们使用andThen方法来实现这个处理的话,就会简单一些。

// 正向与逆向格式化打印, 使用andThen
public class Main {
     public static void main(String[] args) {
        String strs[] = {"张三 男", "李四 男", "小红 女"};
        Consumer<String[]> c1 = (arr) -> {
            System.out.println("------正序输出------");
            for (String str : arr) {
                String s[] = str.split(" ");
                System.out.println(s[0] + ":" + s[1]);
            }
        };
        Consumer<String[]> c2 = (arr) -> {
            System.out.println("------逆序输出------");
            for (int i = arr.length - 1; i >= 0; i --) {
                String s[] = arr[i].split(" ");
                System.out.println(s[0] + ":" + s[1]);
            }
        };
        test(strs, c1.andThen(c2));
    }
    public static <T> void test(T t, Consumer<T> c) {
        c.accept(t);
    }
}

执行结果

------正序输出------
张三:男
李四:男
小红:女
------逆序输出------
小红:女
李四:男
张三:男

由此看出两种写法等效,并且可以看出andThen可以链接两个Consumer的处理变为一个处理,或者说一起处理。当需要链接的Consumer数量不定时,有非常大的作用。传入的参数只需如下即可。

// c1,c2,c3,c4,c5均为Consumer实例
// 如此一来就可以连续执行c1,c2,c3,c4,c5的处理了
test(strs, c1.andThen(c2).andThen(c3).andThen(c4).andThen(c5));

标签:arr,String,接口,------,Supplier,println,Consumer,public
来源: https://www.cnblogs.com/buzuweiqi/p/16584590.html