前言

从毕业到现在正好三年,高难度的项目做了不少,但是基础这个东西一段时间不接触就会忘得一干二净。话不多说,开始今天的学习!

1. Consumer接口

接触过“消费者”,“生产者”模式的同学,肯定对这个单词不陌生,在java8函数式编程和lambda表达式加入之后,这个接口直接深入的影响了之前的集合,JAVA8中Iterable的源代码如下:

package java.lang;import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;public interface Iterable<T> {Iterator<T> iterator();default void forEach(Consumer<? super T> var1) {Objects.requireNonNull(var1);Iterator var2 = this.iterator();while(var2.hasNext()) {Object var3 = var2.next();var1.accept(var3);}}default Spliterator<T> spliterator() {return Spliterators.spliteratorUnknownSize(this.iterator(), 0);}
}

顺便提到的是 default这个接口的默认方法是一起在JAVA8中加入的。

相信大家在处理集合时或多或少都用到了“forEach”这个遍历方法,不得不说这个方法真的是很好用。

package mytest;import java.util.ArrayList;public class StringBuilderTest {public static void main(String[] args) {//准备一个listArrayList<Integer> integers = new ArrayList<>();for(int i = 0 ;i<=10;i++){integers.add(i);}//java8之前的遍历for(Integer i :integers){System.out.println(i);}//java8的遍历integers.forEach(System.out::println);integers.forEach(integer -> System.out.println(integer));}}

jdk8中使用了::的用法。就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下,双冒号运算就是Java中的[方法引用],[方法引用]的格式是:

  类名::方法名

注意此处没有()

一般的lambda表达式就是 -> 符号,跟c++中的调用类中的参数一样。

这样的代码看起来就很整齐,而且在可读性方面也很不错。但是我们今天的主角是Consumer,接下来我换一种写法:

package mytest;import java.util.ArrayList;
import java.util.function.Consumer;public class StringBuilderTest {public static void main(String[] args) {//准备一个listArrayList<Integer> integers = new ArrayList<>();for(int i = 0 ;i<=10;i++){integers.add(i);}//java8之前的遍历for(Integer i :integers){System.out.println(i);}//java8的遍历integers.forEach(System.out::println);//ConsumerConsumer<Integer>  integerConsumer = new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {System.out.println(integer);}};integers.forEach(integerConsumer);}}

唉?这不是我们非常熟悉的匿名内部类吗~

没错,lambda表达式将匿名内部类的创建简化成了一个符号。接下来就该隆重的请上Consumer的源码了:

package java.util.function;import java.util.Objects;@FunctionalInterface
public interface Consumer<T> {void accept(T var1);default Consumer<T> andThen(Consumer<? super T> var1) {Objects.requireNonNull(var1);return (var2) -> {this.accept(var2);var1.accept(var2);};}
}

首先这个接口呢有一个@FunctionalInterface注解,Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。

所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法

这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。

当我们用lambda表达式来时限Consumer接口时,其实就是在实现接口中的这个唯一抽象方法,由于Consumer设计出来是处理数据,并且是不带返回值的,所以在处理打印日志,数据库操作的时候会比较常用到。所以方法里面还有一个andThen方法,顾名思义,就是可以顺序来执行多个Consumer,如下:

package mytest;import java.util.ArrayList;
import java.util.function.Consumer;public class StringBuilderTest {public static void main(String[] args) {//准备一个listArrayList<Integer> integers = new ArrayList<>();for(int i = 0 ;i<=10;i++){integers.add(i);}//java8之前的遍历
//        for(Integer i :integers){
//            System.out.println(i);
//        }//java8的遍历
//        integers.forEach(System.out::println);//ConsumerConsumer<Integer>  integerConsumer = new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {System.out.println(integer);}};integerConsumer = integerConsumer.andThen(integerConsumer).andThen(integerConsumer);integers.forEach(integerConsumer);}}

我做了一个打印X3的效果,结果如下:

0
0
0
1
1
1
2
2
2
3
3
3
4
4
4
5
5
5
6
6
6
7
7
7
8
8
8
9
9
9
10
10
10

所以Consumer作为一个不返回结果的流处理接口,这方面还是很给力的。

作为函数式编程的第一个接口,特点就是“有入参,无出参”。

下一章我们继续学习Predicate接口

Java基础学习之函数式编程Comsumer接口(JDK8)相关推荐

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

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

  2. Java基础学习总结(2)——接口

    一.接口的概念 JAVA是只支持单继承的,但现实之中存在多重继承这种现象,如"金丝猴是一种动物",金丝猴从动物这个类继承,同时"金丝猴是一种值钱的东西",金丝猴 ...

  3. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  4. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  5. 初学Java基础学习——抽象类和接口的区别

    初学Java基础学习--抽象类和接口的区别 一.关键字 1)抽象类的关键字 abstract class A{//定义一个抽象类: } class Test extends A{//子类使用exten ...

  6. java基础学习-6

    Java基础学习-6 双列集合 Map的常见API Map的遍历方式 HashMap 小练习 LinkedHashMap TreeMap TreeMap--小练习1 TreeMap--小练习2 Tre ...

  7. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  8. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  9. Java基础学习(9)

    Java基础学习 一.常用方法(API) 1.1 Math 1.2 System 1.3 Runtime 1. 4 .object 1.5 Objects 1.6 BigInteger BigInte ...

最新文章

  1. python 函数调用 不允许关键字参数_你所不知道的Python|函数参数的演进之路
  2. 快排,归并和Shell排序
  3. 第八篇——Struts2的处理结果类型
  4. jQuery选择器 (详解)
  5. 关于Ubuntu使用笔记
  6. 给 Python 开发者的四条忠告!| CSDN 博文精选
  7. WIN7新功能:跳转列表
  8. 经典机器学习系列(八)【支持向量机】
  9. 分享一个自己写的table表格排序js插件(高效简洁)
  10. plsqldev连oracle,plsqldev怎么联接oracle客户端
  11. 2020年第十七届中国研究生数学建模竞赛赛题+解压码
  12. switchhost 提示没有权限
  13. idea插件开发实战基础
  14. Android系统基础(03) Android系统源码下载
  15. 十分钟理解线性代数的本质_十分钟理解线性代数的本质
  16. 2022年十大科技应用趋势
  17. 在linux系统中 创建用户账户的同时,在Linux系统中大批量建立帐户
  18. Discuz安装与配置
  19. mysql字段的相似度_SQL字段的相似度
  20. 如何让Android屏幕只能上下翻转

热门文章

  1. 快手2018/9/10
  2. unicode转中文
  3. 计算机中mpeg代表什么,mpg和mpeg格式的区别
  4. PTA~习题8-4 报数 (20分) 2020年11月
  5. 读吴军博士《智能时代》有感
  6. CodeForces 964A Splits
  7. poi设置单元格下拉下表
  8. 金属管材光纤激光切管机提高电瓶车制造水平
  9. SEM竞价员一天的工作流程了解一下?
  10. python自动拼图_Python图像处理——人物拼图游戏