ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

函数式接口:Supplier与Consumer

2022-08-14 00:03:23  阅读:120  来源: 互联网

标签:arr String 接口 ------ Supplier println Consumer public


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有