当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    不管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

转载于:https://my.oschina.net/thinwonton/blog/2992371

相关文章:

  • 简单介绍接口自动化测试----数据驱动测试ddt
  • 云计算的拐点隐现 华为云开源两款容器技术
  • 记一份电网信息化建设企业信息分析平台规划
  • 如何快速批量建网站?
  • python3元类深入解读
  • 使用podspec创建iOS插件
  • Spring boot 添加日志 和 生成接口文档
  • 生成器13
  • 一个快速检测系统CPU负载的小程序
  • ionic错误
  • java类什么时候加载?,加载类的原理机制是怎么样的?
  • CSS3 transform变换
  • Python-opencv摄像头图像捕获
  • python入门 (一)
  • mysql 多重排序数据顺序可能不固定
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • IDEA 插件开发入门教程
  • Java的Interrupt与线程中断
  • markdown编辑器简评
  • React 快速上手 - 07 前端路由 react-router
  • SegmentFault 2015 Top Rank
  • ViewService——一种保证客户端与服务端同步的方法
  • Web标准制定过程
  • 我与Jetbrains的这些年
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 原生js练习题---第五课
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 国内开源镜像站点
  • ​力扣解法汇总946-验证栈序列
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (算法二)滑动窗口
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)编辑寄语:因为爱心,所以美丽
  • ****Linux下Mysql的安装和配置
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .gitignore文件—git忽略文件
  • .NET 中 GetProcess 相关方法的性能
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • @Import注解详解
  • @JSONField或@JsonProperty注解使用
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [Android]使用Retrofit进行网络请求
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C#]winform部署yolov5-onnx模型
  • [Django 0-1] Core.Checks 模块
  • [error] 17755#0: *58522 readv() failed (104: Connection reset by peer) while reading upstream