继上回讲完函数式接口后,这次来了解下消费型接口和供给型接口:即Consumer和Supplier接口;

首先从Consumer接口开始:

Comsumer:

这个接口里面有两个方法,一个叫accept,一个叫andThen;

(1)accept:

在创建一个消费型的实现类时,要传入一个泛型参数,这个泛型参数也是accept的接受参数类型,如下例代码:

public class Main {public static void main(String[] args) {//创建一个实现类,并实现其方法,注意这里需要指明泛型。Test("lbwnb", new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println("说得好:" + s);    //说得好:lbwnb}});}//创建一个接受消费实现类的静态方法,在里卖弄直接调用里面的accept函数public static void Test(String data,Consumer<String> consumer){consumer.accept(data);}}

消费型接口有一个显然得特点:有来无回。它接受一个参数,在里面执行一些操作,执行完过后是没有返回值的。

(2)andThen:

这个方法也与Function接口的andThen相似,也就是你传入的另外一个方法的执行顺序,下面来看示例:

public class Main {public static void main(String[] args) {Consumer<String> consumer1=new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println("小明说:"+s);}};Consumer<String> consumer2=new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println("小红说:"+s);}};//小明说:lbwnb//小红说:lbwnbconsumer1.andThen(consumer2).accept("lbwnb");}
}

这个方法允许对传入的数据进行操作,但是要注意,只是对数据源进行操作,如果你的操作并不会直接或者间接改变数据源,那很遗憾,你第一个操作不会影响到操作二的数据。

Supplier:

这个接口相对来说理解就更加的简单,因为它只有一个方法:get()。这个方法没有参数传入,只有返回值,有小伙伴就疑问了,没有参数传入,那岂不是返回的数值是一个定值咯,其实不然,只要你合理运用就会有奇特的效果。

下面来看代码:

先创建一个Student类,给每个字段配上getter,setter。并且重写toString方法。

public class Student {private String name;private Integer age;public Student(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}//重写toString方法@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

然后开始使用:

public class Main {public static void main(String[] args) {//创建学生列表,并添加数据。List<Student> students=new ArrayList<>();students.add(new Student("lbw",18));students.add(new Student("小刚",17));students.add(new Student("小红",26));students.add(new Student("小川",13));students.add(new Student("李华",19));//调用方法--返回已成年的学生列表Test(students).forEach(e->{System.out.println(e);});}public static List<Student> Test(List<Student> list){Supplier<List<Student>> supplier=new Supplier<List<Student>>() {@Overridepublic List<Student> get() {//创建一个返回列表List<Student> res= new ArrayList();//将年龄大于等于18的加入列表list.forEach(e->{if(e.getAge()>=18){res.add(e);}});//返回列表return res;}};return supplier.get();}
}

这个例子中,它主要是利用作用域特点的方式来获取外界的值(传入学生列表,对列表进行滤)。有人就问,我为啥直接不省去这个接口实现类,直接将逻辑写在里面,但是你得考虑它的万一有复杂的逻辑,或者其他需求呢。还有就是我这只是一个小demo,别较真。真的有用的,就算你不会直接用,但有些内置方法它就是要求你去传入一个Supplier实现类。

好,本次的介绍就到这儿,有啥不懂得可以评论一起探讨学习,有不正确得欢迎指正。

Consumer接口和Supplier接口相关推荐

  1. JAVA8之函数式编程Supplier接口和Consumer接口

    JAVA8之函数式编程Supplier接口和Consumer接口 一.    Supplier接口 顾名思义,这是一个供应商,提供者.就如一个工厂一样.该类的源码如下: package java.ut ...

  2. Java基础二十二:函数式接口介绍,函数式接口作为方法参数、返回值,Supplier接口、Consumer接口、Predicate接口、Function接口基本介绍及其案例小练习

    函数式接口 1. 函数式接口概念及基本使用 1.函数式接口:有且仅有一个抽象方法的接口,函数式接口就是Lambda表达式使用的前提 2. Java中的函数式编程体现的就是Lambda表达式,所以函数式 ...

  3. java 接口函数_Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰 ...

  4. java supplier接口_Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰 ...

  5. 【Java 进阶】匿名类(代码传递、回调、过滤器)、Lambda表达式(方法引用)、函数式接口(Supplier、Consumer、Predicate、Function)

    匿名类 匿名类(Anonymous Class) 匿名类的使用注意 匿名类 - 代码传递 - 测试代码运行时间的工具类 匿名类 - 回调 - 简易网络请求 匿名类 - 过滤器 - 获取目录下的所有文件 ...

  6. java8 supplier_Java8 Supplier接口和Consumer接口原理解析

    Supplier接口 package java.util.function; /** * Represents a supplier of results. * * There is no requi ...

  7. 【java笔记】常用函数式接口(1):Supplier接口

    [java笔记]常用接口(2):Consumer接口_m0_52043808的博客-CSDN博客 [java笔记]常用函数式接口(3):Predicate接口_m0_52043808的博客-CSDN博 ...

  8. Supplier JAVA_Java基础学习之函数式编程Supplier接口(JDK8)

    前言 今天带大家领略一下Supplier接口大道至简的魅力. 1.源码 @FunctionalInterface public interface Supplier { /*** Gets a res ...

  9. 常用函数式接口之Supplier

    Supplier接口 Supplier<T>接口也被称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用. 常用方法 只有一个无参的方 ...

最新文章

  1. python语言标识符首字符不能是_Python语言标识符的命名规定,首字符不能是( )...
  2. RecyclerView优秀文集
  3. 用CORS 解决vue.js django跨域调用
  4. Ubuntu安装 AndroidStudio
  5. eclipse中去掉警告提示
  6. 用python批量下载网络图片_python批量下载图片的三种方法
  7. 新款iPhone SE发布日期曝光:小屏果粉早已按捺不住
  8. python财务管理
  9. 35. 内容协商和转码
  10. wget通过代理上网办法
  11. ssh遇到密钥更改问题
  12. Windows环境下使用UHD PythonAPI开发USRP X310
  13. c盘减肥//请在阅读本文之前查看你C盘的可用空间
  14. 审车的时候环保怎样安全通过_审车环保3次不过怎么办,年检尾气不合格怎么办...
  15. Android系统体系结构
  16. IT 行业中Dev、RD、CPO、TeamLeader、QA、PM、PO ,HC,TL 分别是什么的简称,他们分别对应的职责是什么?
  17. 森林防火无线监控系统解决方案
  18. el-date-picker 日期过滤周末节假日
  19. css鼠标点击后取消光标焦点,光标设置透明
  20. HMaster因zookeeper连接超时自杀

热门文章

  1. Mybatis从零开始
  2. FLASH(M25P16)-页编程(PP)指令时序代码及仿真波形(内含M25P16仿真模型文件)
  3. android颜色透明度百分比
  4. 微信公众平台测试帐号申请网址
  5. 计算机视觉岗实习面经
  6. 安装有关软件出现无法访问windows Installer服务。
  7. 十一.再函数进阶+requests网络爬虫
  8. 三通道图像和四通道图像
  9. 小米8 twrp recovery_小米手机机型怎么刷入脸谱Magisk模块详细教程
  10. 截屏工具、录屏工具不能用?是因为这个!!