文档章节

java8 -函数式编程之四个基本接口

细肉云吞
 细肉云吞
发布于 2018/12/24 11:33
字数 778
阅读 1.1K
收藏 8

    不管lambda表达式还是Stream流式编程,Function、Consumer、Supplier、Predicate 四个接口是一切函数式编程的基础。下面我们详细学习这四个巨头,

interface Supplier<T>

    该接口的中文直译是“提供者”,可以理解为定义一个lambda表达式,没有输入参数,返回一个T类型的值。

Supplier<Integer> supplier = () -> 10;
//输出10
System.out.println(supplier.get());

interface Consumer<T>

    该接口的中文直译是“消费”,可以理解为定义一个lambda表达式,接收一个T类型的参数,并且没有返回值。

  • accept :接收参数,并调用Consumer接口里的方法
Consumer<Integer> print = x -> System.out.println(x);
//输出10
print.accept(10);

 

  • andThen:调用完consumer自己后,还调用andThen方法参数中指定的Consumer
Consumer<Integer> print = x -> System.out.println(x);
Consumer<Integer> printPlusSelf = x -> System.out.println(x + x);

//输出10以及20
print.andThen(printPlusSelf).accept(10);

interface Function<T, R>

        该接口的中文直译是“函数”,可以理解为:定义一个lambda表达式接收一个T类型的参数,返回一个R类型的值。

  • apply:传入一个T类型的参数,返回一个R类型的值

Function<Integer, Integer> plusSelf = x -> x + x;

//apply
System.out.println(plusSelf.apply(10));

 

  • compose:accept获取到的参数,先执行compose里面的Function,再执行原Function

        //两个function
        Function<Integer, Integer> plusSelf = x -> {
            System.out.println("plusSelf");
            return x + x;
        };
        Function<Integer, String> toString = x -> {
            System.out.println("toString");
            return String.valueOf(x);
        };

        //输出20,整数10先自加变成20,然后由toString转换成字符串
        String string1 = toString.compose(plusSelf).apply(10);
        System.out.println(string1);

 

  • andThen:与compose相反。先执行原Function,在执行andThen里面的Function。

        //两个function
        Function<Integer, Integer> plusSelf = x -> {
            System.out.println("plusSelf");
            return x + x;
        };
        Function<Integer, String> toString = x -> {
            System.out.println("toString");
            return String.valueOf(x);
        };

        //输出20, 先自加,再转换成字符串
        String string2 = plusSelf.andThen(toString).apply(10);
        System.out.println(string2);

 

interface Predicate<T>

    该接口的中文直译是“断言”,用于返回false/true。T是lambda表达式的输入参数类型。

  • test :测试test方法中输入参数是否满足接口中定义的lambda表达式

        Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);

        //test
        System.out.println(test.test("test")); //true
        System.out.println(test.test("test_false")); //false

 

  • and :原 Predicate 接口和 and 方法中指定的 Predicate 接口要同时为true,test方法才为true。与逻辑运算符 && 一致。

        Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);

        //and
        System.out.println(test.and(test2).test("test")); //false

 

  • negate:对结果取反后再输出

        Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);

        //negate
        System.out.println(test.negate().test("test")); //false

 

  • or:原 Predicate 接口和 or 方法中指定的 Predicate 接口只要一个为true,test方法为true。与逻辑运算符 || 一致。
        Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);
        //or
        System.out.println(test.or(test2).test("test")); //false

 

相关资料

Java 8 函数式编程系列

    java8 -函数式编程之Lambda表达式

    java8 -函数式编程之四个基本接口

    java8 -函数式编程之Optional

    java8 -函数式编程之Stream

© 著作权归作者所有

细肉云吞

细肉云吞

粉丝 122
博文 296
码字总数 203317
作品 1
其它
高级程序员
私信 提问
加载中

评论(0)

java8 -函数式编程之Lambda表达式

1 前言 java 8已经流行很多年了,springboot 2、spring 5 等开源代码也已经开始使用大量函数式编程。为了跟上潮流和看懂一些源码,下面我们一起学习java8的函数式编程。由于在lambda的学习过...

细肉云吞
2018/12/20
605
0
java8 -函数式编程之Optional

前言 在某些情况下,首先要判断某个参数或者某个方法的返回值是否为null,才能继续操作该参数。对于某些链式操作需要多次通过if语句判断是否为空,才能确保不抛出NullPointerException,这段...

细肉云吞
2018/12/24
368
1
java8 -函数式编程之Stream

在 java8 -函数式编程之Lambda表达式、 java8 -函数式编程之四个基本接口 、java8 -函数式编程之Optional 三篇文章中,我们已经对函数式编程有了充分的了解,接下来,我们将会运用之前学到的...

细肉云吞
2018/12/24
982
1
Java8函数式编程以及Lambda表达式

第一章 认识Java8以及函数式编程 关注公众号(CoderBuff)回复“stream”获取《Java8 Stream编码实战》PDF完整版。 《Java8 Stream编码实战》的代码全部在https://github.com/yu-linfeng/Blo...

OKevin
03/23
0
0
一起来学Java8(一)——函数式编程

在这篇文章中,我们将了解到在Java8下如何进行函数式编程。 函数式编程 所谓的函数式编程就是把函数名字当做值进行传递,然后接收方拿到这个函数名进行调用。 首先来看下JavaScript如何进行函...

tanghc
2019/10/19
130
0

没有更多内容

加载失败,请刷新页面

加载更多

windows虚拟主机控制面板哪个比较好用?

相对于Linux发行版本的系统,大多人都比较习惯使用windows系统,同时windows虚拟主机对于 ASP.NET,PHP等热门程序也有了广泛的友好支持。因此,很多新手站长比较倾向于使用windows虚拟主机,...

好么好的_920
26分钟前
14
0
如何使用Elasticsearch中提供的RESTFul风格API? 快来快来,加入小案例需求 不要错过哦~~

前言: 本篇会以小案例需求的方式带你学习Elasticsearch中基于RESTFulApi操作。手敲几遍,想不会也难。加油~ 对了,这里使用的是Kibana和head进行的管理,如果没有接触,推荐看下面的博客,写的挺...

漫路h
45分钟前
23
0
Centos8 安装MySQL

MySQL 是最流行的开源关系数据库管理系统。在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 默认的CentOS 8存储库安装最新...

忧郁的熊
今天
23
0
Word文档中遇到不认识的字怎么办?word 2019 for Mac自带拼音功能你知道吗?

Word 2019 for Mac中遇到不认识的字怎么办?你是不是要告诉我,找百度!那如果没有网又该怎么办? 经常接触文档,总会遇到很多不认识的字,不用百度只用Word也能快速读对,一起来学学吧! wo...

mac小叮当
今天
24
0
docker下mysql8版本的安装运行及navicat的连接

一、下载 $ docker pull mysql:8.0.19 一般来说这个速度是比较慢的,我试了几次都不行,只好换一个国内的镜像: $ mkdier -p /etc/docker$ tee /etc/docker/daemon.json << 'EOF'{ 'r......

最深的夜
今天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部