文档章节

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

细肉云吞
 细肉云吞
发布于 2018/12/24 11:33
字数 778
阅读 863
收藏 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

© 著作权归作者所有

细肉云吞

细肉云吞

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

评论(0)

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

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

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

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

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

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

细肉云吞
2018/12/24
878
1
一起来学Java8(一)——函数式编程

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

tanghc
2019/10/19
122
0
Java8新特性:函数式接口@FunctionalInterface使用说明

Java8新特性:接口静态方法与默认方法 Java8新特性:函数式接口@FunctionalInterface使用说明 Java8新特性:方法引用 Java8新特性:函数式编程 我们常用的一些接口Callable,Runnable,Comparato...

键走偏锋
2018/08/05
359
0

没有更多内容

加载失败,请刷新页面

加载更多

11个默克尔树开源项目

Merkle树是一种可以有效验证部分数据存在于指定数据集并且未被篡改的高效的哈希树结构,作为一种底层技术广泛应用在各种区块链的实现当中,对于商品溯源、知识产权确认、区块链公证等区块链应...

区块链教程
29分钟前
58
0
Linux系统运维工程师入门绝招放送

运维是干嘛的?安装服务器系统?重装系统再装系统?背锅的? 我就稀里糊涂的,这样报着必死的决心,考下RHCE认证,走上了Linux运维的道路,成为了一名linux运维工程师。有些心得跟大家分享下...

linuxprobe2020
33分钟前
45
0
开源商城开发笔记4-配置MyBatis生成代码

本项目基于SpringBoot开发,引入的是mybatis-spring-boot 1、引入依赖,包括spring-boot,mybatis,druid,junit,log4j 2.配置MyBatis-Generator插件,使用Maven插件的方式生成代码 3.配置M...

土龙
今天
85
0
Java深拷贝和浅拷贝

对象拷贝有哪些 对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部数据。 ...

Onegoleya
今天
86
0
Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
今天
72
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部