【jdk1.8特性】之Function

2023-11-04

笔者日常 来吧,Function~


相关声明

  • 本文按照以下顺序进行说明并给出简单的使用示例:

    序号 接口
    1 Function<T, R>
    2 IntFunction<R>
    3 DoubleFunction<R>
    4 LongFunction<R>
    5 ToIntFunction<T>
    6 ToLongFunction<T>
    7 ToDoubleFunction<T>
    8 IntToDoubleFunction
    9 IntToLongFunction
    10 LongToDoubleFunction
    11 LongToIntFunction
    12 DoubleToIntFunction
    13 DoubleToLongFunction
    14 BiFunction<T, U, R>
    15 ToIntBiFunction<T, U>
    16 ToLongBiFunction<T, U>
    17 ToDoubleBiFunction<T, U>
  • 先给出下文的示例中所涉及到的模型:

    /**
     * 员工实体模型
     *
     * @author JustryDeng
     * @date 2019/7/15 19:48
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class Staff implements Serializable {
    
        /** 姓名 */
        private String name;
    
        /** 年龄 */
        private Integer age;
    
        /** 工号 */
        private String staffNo;
    
    }
    

Function<T, R>

  • R apply(T t) 输入T类型的参数,运行相关逻辑后,返回R类型的结果。
    使用示例:

    /**
     *  R apply(T t): 输入T类型的参数,运行相关逻辑后,返回R类型的结果。
     */
    @Test
    public void test1() {
        Function<String, Staff> function = x -> {
            Staff s = new Staff();
            s.setName(x + ", 咿呀咿呀哟!");
            return s;
        };
    
        Staff staff = function.apply("邓某");
        // 输出: 邓某, 咿呀咿呀哟!
        System.out.println(staff.getName());
    }
    
  • Function<V, R> compose(Function<? super V, ? extends T> before) 由两个旧的Function得到一个新的Function。

    假设: 现有式子functionC = functionB.compose(functionA),functionA 泛型为<P1, R1>, functionB泛型为<R1, R2>。

    那么, 上述式子的逻辑是:先运行functionA<P1, R1>的apply方法,然后将其返回值作为functionB<R1, R2>的apply方法的入参,执行functionB<R1, R2>的apply方法,返回一个泛型为<P1, R2>的functionC<P1, R2>。

    使用示例:

     /**
      * <V> Function<V, R> compose(Function<? super V, ? extends T> before):由两个旧的Function得到一个新的Function。
      *
      * 假设:现有式子functionC = functionB.compose(functionA),
      *      functionA泛型为<P1, R1>, functionB泛型为<R1, R2>。
      *
      * 那么,上述式子的逻辑是:先运行functionA<P1, R1>的apply方法,然后将其返回值
      *                     作为functionB<R1, R2>的apply方法的入参,执行
      *                     functionB<R1, R2>的apply方法,返回一个泛型为
      *                     <P1, R2>的functionC<P1, R2>。
      */
     @Test
     public void test2() {
     
         Function<String, Integer> functionA = x -> {
             Objects.requireNonNull(x, "参数不能为空");
             x = x.replace(" ", "");
             return x.length();
         };
     
         Function<Integer, Staff> functionB = x -> {
             Objects.requireNonNull(x, "参数不能为空");
             Staff s = new Staff();
             s.setAge(x);
             return s;
         };
     
         Function<String, Staff> functionC = functionB.compose(functionA);
         Staff staff = functionC.apply(" 我 是 参 数 ! ");
         // 输出: Staff(name=null, age=5, staffNo=null)
         System.out.println(staff);
     }
    
  • Function<T, V> andThen(Function<? super R, ? extends V> after 由两个旧的Function得到一个新的Function。
    假设: 现有式子functionC = functionA.andThen(functionB),functionA泛型为<P1, R1>, functionB泛型为<R1, R2>。
    那么, 上述式子的逻辑是:先运行functionA<P1, R1>的apply方法,然后将其返回值作为functionB<R1, R2>的apply方法的入参,执行functionB<R1, R2>的apply方法,返回一个泛型为<P1, R2>的functionC<P1, R2>。
    注: functionA.andThen(functionB)是先执行functionA,再执行functionB;而functionA.compose(functionB)是先执行functionB,再执行functionA。
    使用示例:

     /**
      * <V> Function<T, V> andThen(Function<? super R, ? extends V> after):由两个旧的Function得到一个新的Function。
      *
      * 假设:现有式子functionC = functionA.andThen(functionB),
      *      functionA泛型为<P1, R1>, functionB泛型为<R1, R2>。
      *
      * 那么,上述式子的逻辑是:先运行functionA<P1, R1>的apply方法,然后将其返回值
      *                     作为functionB<R1, R2>的apply方法的入参,执行
      *                     functionB<R1, R2>的apply方法,返回一个泛型为
      *                     <P1, R2>的functionC<P1, R2>。
      *
      * 注: functionA.andThen(functionB)是先执行functionA,再执行functionB;
      *     而functionA.compose(functionB)是先执行functionB,再执行functionA。
      */
     @Test
     public void test3() {
     
         Function<String, Integer> functionA = x -> {
             Objects.requireNonNull(x, "参数不能为空");
             x = x.replace(" ", "");
             return x.length();
         };
     
         Function<Integer, Staff> functionB = x -> {
             Objects.requireNonNull(x, "参数不能为空");
             Staff s = new Staff();
             s.setAge(x);
             return s;
         };
     
         Function<String, Staff> functionC = functionA.andThen(functionB);
         Staff staff = functionC.apply(" 我 是 参 数 ! ");
         // 输出: Staff(name=null, age=5, staffNo=null)
         System.out.println(staff);
     }
    
  • static Function<T, T> identity() 将输入的参数进行返回,即: return t -> t。
    注: 在某些情景下,使用Function.identity(),会让代码更优雅。
    使用示例:

     /**
      * static <T> Function<T, T> identity(): 将输入的参数进行返回,即: return t -> t。
      *
      * 说明: 在某些情景下,使用Function.identity(),会让代码更优雅。
      */
     @Test
     public void test4() {
         /*
          * 使用普通的lambda表达式
          */
         Map<Integer, String> mapOne = Stream.of("a", "ab", "abc", "abcd", "abcde").collect(
                 Collectors.toMap(String::length, param -> param)
         );
         // 输出: {1=a, 2=ab, 3=abc, 4=abcd, 5=abcde}
         System.out.println(mapOne);
     
         /*
          * 使用Function.identity()无疑更优雅
          */
         Map<Integer, String> mapTwo = Stream.of("a", "ab", "abc", "abcd", "abcde").collect(
                 Collectors.toMap(String::length, Function.identity())
         );
         // 输出: {1=a, 2=ab, 3=abc, 4=abcd, 5=abcde}
         System.out.println(mapTwo);
     }
    

IntFunction<R>

  • R apply(int value) 入参类型必须为int, (运行相关逻辑后)返回R类型的数据。
    使用示例:
     /**
      * R apply(int value): 入参类型必须为int, (运行相关逻辑后)返回R类型的数据。
      */
     @Test
     public void test5() {
         IntFunction<Staff> intFunction = x -> {
             Staff staff = new Staff();
             staff.setAge(x);
             return staff;
         };
     
         Staff res = intFunction.apply(100);
         // 输出: Staff(name=null, age=100, staffNo=null)
         System.out.println(res);
     }
    

DoubleFunction<R>

  • R apply(double value) 入参类型必须为double,(运行相关逻辑后)返回R类型的数据。
    使用示例:
     /**
      * R apply(double value): 入参类型必须为double, (运行相关逻辑后)返回R类型的数据
      */
     @Test
     public void test6() {
         DoubleFunction<String> doubleFunction = x -> (x + "").replace(".", "_");
         String res = doubleFunction.apply(10.01);
         // 输出: 10_01
         System.out.println(res);
     }
    

LongFunction<R>

  • R apply(long value) 入参类型必须为long, (运行相关逻辑后)返回R类型的数据。

    使用示例:

     /**
      * R apply(long value): 入参类型必须为long, (运行相关逻辑后)返回R类型的数据。
      */
     @Test
     public void test7() {
         LongFunction<String> longFunction = x -> (x + "").replace("4", "  8484884  ").trim();
         String res = longFunction.apply(484);
         // 输出: 8484884  8  8484884
         System.out.println(res);
     }
    

ToIntFunction<T>

  • int applyAsInt(T value) 入参类型为T,(运行相关逻辑后)返回类型必为int。
    使用示例:
     /**
      * int applyAsInt(T value): 入参类型为T, (运行相关逻辑后)返回类型必为int。
      */
     @Test
     public void test8() {
         ToIntFunction<String> toIntFunction = x -> x == null ? 0 : x.length();
         int res = toIntFunction.applyAsInt("蚂蚁呀~嘿!嘿!");
         // 输出: 8
         System.out.println(res);
     }
    

ToLongFunction<T>

  • long applyAsLong(T value) 入参类型为T, (运行相关逻辑后)返回类型必为long。
    使用示例:
     /**
      * long applyAsLong(T value): 入参类型为T, (运行相关逻辑后)返回类型必为long。
      */
     @Test
     public void test9() {
         ToLongFunction<String> toLongFunction = x -> x == null ? 0 : new SecureRandom(x.getBytes()).nextLong();
         long res = toLongFunction.applyAsLong("蚂蚁呀~嘿!嘿!");
         // 输出: 2677168598702751372
         System.out.println(res);
     }
    

ToDoubleFunction<T>

  • double applyAsDouble(T value) 入参类型为T,(运行相关逻辑后)返回类型必为double。
    使用示例:
     /**
      * double applyAsDouble(T value): 入参类型为T, (运行相关逻辑后)返回类型必为double。
      */
     @Test
     public void test10() {
         ToDoubleFunction<Float> toDoubleFunction = x -> x == null ? 0.0 : x;
         double res = toDoubleFunction.applyAsDouble(123.4F);
         // 输出: 123.4000015258789 (注:精度问题不在本文的讨论范围内)
         System.out.println(res);
     }
    

IntToDoubleFunction

  • double applyAsDouble(int value) 入参类型必须为int,(运行相关逻辑后)返回类型必为double。
    使用示例:
     /**
      * double applyAsDouble(int value): 入参类型必须为int, (运行相关逻辑后)返回类型必为double。
      */
     @Test
     public void test11() {
         IntToDoubleFunction intToDoubleFunction = x -> x + 88.8;
         double res = intToDoubleFunction.applyAsDouble(12300);
         // 输出: 12388.8
         System.out.println(res);
     }
    

IntToLongFunction

  • long applyAsLong(int value) 入参类型必须为int,(运行相关逻辑后)返回类型必为long。
    使用示例:
     /**
      * long applyAsLong(int value): 入参类型必须为int, (运行相关逻辑后)返回类型必为long。
      */
     @Test
     public void test12() {
         IntToLongFunction intToLongFunction = x -> x + 1000L;
         long res = intToLongFunction.applyAsLong(12345);
         // 输出: 13345
         System.out.println(res);
     }
    

LongToDoubleFunction

  • double applyAsDouble(long value) 入参类型必须为long, (运行相关逻辑后)返回类型必为double。
    使用示例:
     /**
      * double applyAsDouble(long value): 入参类型必须为long, (运行相关逻辑后)返回类型必为double。
      */
     @Test
     public void test13() {
         LongToDoubleFunction longToDoubleFunction = x -> x + 1000000D;
         double res = longToDoubleFunction.applyAsDouble(12345L);
         // 输出: 1012345.0
         System.out.println(res);
     }
    

LongToIntFunction

  • int applyAsInt(long value) 入参类型必须为long,(运行相关逻辑后)返回类型必为int。
    使用示例:
     /**
      * int applyAsInt(long value): 入参类型必须为long, (运行相关逻辑后)返回类型必为int。
      */
     @Test
     public void test14() {
         LongToIntFunction longToIntFunction = x -> (int)(x / 1000);
         int res = longToIntFunction.applyAsInt(12345L);
         // 输出: 12
         System.out.println(res);
     }
    

DoubleToIntFunction

  • int applyAsInt(double value) 入参类型必须为double,(运行相关逻辑后)返回类型必为int。
    使用示例:
     /**
      * int applyAsInt(double value): 入参类型必须为double, (运行相关逻辑后)返回类型必为int。
      */
     @Test
     public void test15() {
         DoubleToIntFunction doubleToIntFunction = x -> (int)x;
         int res = doubleToIntFunction.applyAsInt(123.45);
         // 输出: 123
         System.out.println(res);
     }
    

DoubleToLongFunction

  • long applyAsLong(double value) 入参类型必须为double,(运行相关逻辑后)返回类型必为long。
    使用示例:
     /**
      * long applyAsLong(double value): 入参类型必须为double, (运行相关逻辑后)返回类型必为long。
      */
     @Test
     public void test16() {
         DoubleToLongFunction doubleToLongFunction = x -> (long)x;
         long res = doubleToLongFunction.applyAsLong(112233.4455);
         // 输出: 112233
         System.out.println(res);
     }
    

BiFunction<T, U, R>

  • R apply(T t, U u) 输入T类型、U类型的参数,运行相关逻辑后,返回R类型的结果。
    使用示例:

     /**
      *  R apply(T t, U u): 输入T类型、U类型的参数,运行相关逻辑后,返回R类型的结果。
      */
     @Test
     public void test17() {
         BiFunction<Integer, String, Staff> biFunction = (x, y) -> {
             Staff s = new Staff();
             s.setAge(x);
             s.setName(y);
             return s;
         };
     
         Staff staff = biFunction.apply(25, "单身邓");
         // 输出: 单身邓, 25岁!
         System.out.println(staff.getName() + ", " + staff.getAge() + "岁!");
     }
    
  • BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) 由一个旧的BiFunction以及一个旧的Function得到一个新的BiFunction<T, U, V>。
    假设: 现有式子biFunctionC = biFunctionA.andThen(functionB),biFunctionA泛型为<P1, T1, R1>, functionB泛型为<R1, R2>。
    那么, 上述式子的逻辑是:先运行biFunctionA<P1, T1, R1>的apply方法,然后将其返回值作为functionB<R1, R2>的apply方法的入参,执行functionB<R1, R2>的apply方法,返回一个泛型为<P1, T1, R2>的biFunctionC<P1, T1, R2>。
    使用示例:

     /**
      * <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after):
      *     由一个旧的BiFunction以及一个旧的Function得到一个新的BiFunction<T, U, V>。
      *
      * 假设:现有式子biFunctionC = biFunctionA.andThen(functionB),
      *      biFunctionA泛型为<P1, T1, R1>, functionB泛型为<R1, R2>。
      *
      * 那么,上述式子的逻辑是:先运行biFunctionA<P1, T1, R1>的apply方法,然后将其返回值
      *                     作为functionB<R1, R2>的apply方法的入参,执行
      *                     functionB<R1, R2>的apply方法,返回一个泛型为
      *                     <P1, T1, R2>的biFunctionC<P1, T1, R2>。
      */
     @Test
     public void test18() {
         BiFunction<Integer, String, Staff> biFunctionA = (x, y) -> {
             Staff s = new Staff();
             s.setAge(x);
             s.setName(y);
             return s;
         };
     
         Function<Staff, Map<String, Staff>> functionB = x -> {
             Map<String, Staff> map = new HashMap<>(4);
             map.put(x.getName(), x);
             return map;
         };
     
         BiFunction<Integer, String,  Map<String, Staff>> biFunctionC = biFunctionA.andThen(functionB);
     
         Map<String, Staff> map = biFunctionC.apply(25, "单身邓");
         // 输出: {单身邓=Staff(name=单身邓, age=25, staffNo=null)}
         System.out.println(map);
     }
    

ToIntBiFunction<T, U>

  • int applyAsInt(T t, U u) 入参类型为T和U,(运行相关逻辑后)返回类型必为int。
    使用示例:
     /**
      * int applyAsInt(T t, U u): 入参类型为T和U, (运行相关逻辑后)返回类型必为int。
      */
     @Test
     public void test19() {
         ToIntBiFunction<String, Double> toIntBiFunction = (x, y) -> Integer.parseInt(x) + y.intValue();
         int res = toIntBiFunction.applyAsInt("123000", 456.789);
         // 输出: 123456
         System.out.println(res);
     }
    

ToLongBiFunction<T, U>

  • long applyAsLong(T t, U u) 入参类型为T和U, (运行相关逻辑后)返回类型必为long。
    使用示例:
     /**
      * long applyAsLong(T t, U u): 入参类型为T和U, (运行相关逻辑后)返回类型必为long。
      */
     @Test
     public void test20() {
         ToLongBiFunction<String, Double> toLongBiFunction = (x, y) -> Integer.parseInt(x) + y.intValue();
         long res = toLongBiFunction.applyAsLong("123000", 456.789);
         // 输出: 123456
         System.out.println(res);
     }
    

ToDoubleBiFunction<T, U>

  • double applyAsDouble(T t, U u) 入参类型为T和U,(运行相关逻辑后)返回类型必为double。
    使用示例:
     /**
      * double applyAsDouble(T t, U u): 入参类型为T和U, (运行相关逻辑后)返回类型必为double。
      */
     @Test
     public void test21() {
         ToDoubleBiFunction<String, Double> toDoubleBiFunction = (x, y) -> Integer.parseInt(x) + y;
         double res = toDoubleBiFunction.applyAsDouble("123000", 456.789);
         // 输出: 123456.789
         System.out.println(res);
     }
    


^_^ 如有不当之处,欢迎指正

^_^ 参考资料
        《jdk api 1.8_google.CHM》

^_^ 测试代码托管链接
         https://github.com/JustryDeng…Jdk8Feature

^_^ 本文已经被收录进《程序员成长笔记》 ,笔者JustryDeng

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【jdk1.8特性】之Function 的相关文章

随机推荐

  • SystemUI详解

    目录 一 简介 二 SystemUI的架构 三 SystemUI的主要组件 四 SystemUI的主要功能 五 SystemUI的自定义和定制 六 SystemUI的性能优化 一 简介 SystemUI是Android操作系统的一个关键组件
  • C语言枚举类型的大小

    主流编译器如 gcc vc MinGW gcc等枚举变量均为4字节 少量编译器会根据枚举个数做优化 如只有3个枚举值时 size可能为1 enum长度不确定会带来可移植性问题 如果第三方库API接口使用enum类型 编译和调用库时一旦有关e
  • c++读取TXT文件内容

    c 读取TXT文件内容 首先添加头文件 include
  • Cron expression must consist of 6 fields

    corn 表达式为 Scheduled cron 20 2021 运行代码提示报错 Cron 表达式必须包含 6 个字段 Cron expression must consist of 6 fields found 7 in 20 2021
  • 光盘装系统和U盘装系统有什么区别?哪个好?

    光盘装系统和U盘装系统的区别 U盘 U盘安装就是利用U盘启动盘制作工具 制作U盘启动盘 之后从U盘启动WIN PE 系统 再加载下载好的系统镜像进行安装的方法 光盘 光盘安装法就是利用购买好的系统盘 或者自己制作的系统盘 利用电脑的光驱 直
  • Uni-app登录态管理(vuex)

    转载 https www cnblogs com edward life p 11181139 html 应用中 保持登录状态是常见需求 本文讲解使用uni app框架时如何保持用户登录状态 即 初次进入应用为未登录状态 gt 登录 gt
  • html提交表单 node,Nodejs之http的表单提交

    之前介绍了http模块的请求与响应的过程 也介绍了TCP协议的客户端与服务端的数据传输 http协议是TCP上层协议 这里创建了一个简单的web服务器 并对提交表单数据进行处理 根据了不起的Node js一书总结 POST方法提交表单数据
  • centso7 openssl 报错Verify return code: 20 (unable to get local issuer certificate)

    问题重现 由于centos7 默认的openssl的版本为1 1 0k 本人编译媒体服务时 需要openssl版本1 1 1以上 所有删除的之前的低版本openssl 手动编译了一个1 1 1k的版本 媒体服务正常运行 并且CA验证正常 结
  • hadoop完全分布式一键安装、启动、停止脚本

    hadoop完全分布式一键安装脚本 bin bash 配置HADOOP的安装目录 修改的地方1 脚本可以自己创建 在windows编写的代码可能运行有问题执行以下 1 gt vim redisshell sh 2 gt set ff uni
  • 1.使用SQL语句创建表

    1 创建表的语法 create table 表名 列1 数据类型 1 列2 数据类型 tablespace 表空间 SQL create table student ID NUMBER not null NAME VARCHAR2 20 表
  • 综合能力 ---- 1. 通信职业道德

    1 职业道德内涵 职业义务 职业良心 职业荣誉 职业信誉 职业尊严 职业纪律 2 记忆职业和职业道德概念 职业 人们在社会中所从事的专门业务和对社会所承担的特定职责 并以此作为重要生活来源的社会活动 职业道德 人们从事正当的社会职业 并在其
  • chrome.runtime.sendMessage 回调函数参数为undefined

    chrome runtime sendMessage 回调函数参数为undefined chrome runtime sendMessage的回调函数默认是同步的 而且超时后直接执行 返回undefined 如果要异步执行 必须在处理函数中
  • Vim,人类史上最好用的文本编辑器!从此以后你就是一个善良的极客!

    CSDN 的小伙伴们 大家好 我是沉默王二 写完 Shell 那篇后就想写 Vim 了 因为人类史上最好的文本编辑器就是 Vim 不赞同的请自觉持有保留意见 哈哈哈 Better Stronger Faster 用这三个单词来赞美 Vim
  • iOS(三)实现App底部TabBar的切换:二

    上一篇讲述了iOS自带的TabBar 但在我所见到的很多App源码中大多用了自己写的TabBar 惯例先上图 这只是一个最简单的TabBar 但重在原理 虽然是我懒 HomeViewController h HomeViewControll
  • day17-json和面向对象(总结)

    day17 json和面向对象 姚万里 1 json数据 1 json数据格式的作用 json和xml是两种通用的数据格式 几乎所有的高级编程语言都支持 json和xml数据的格式的存在 是为了让不同编程语言的程序可以进行有效的数据沟通 2
  • VSCode: PlatformIO主页一直显示loading解决方案

    VSCode PlatformIO主页一直显示loading解决方案 Github问题描述 Could not start PIO Home server Error timeout 205 在vscode中打开platformio点击进入
  • 海豚php上传音频方法(引用 layui的 js 与 css)

    1 html代码 div class layui upload div div div
  • 1033. 旧键盘打字(20)--Python

    之前的时候最后一个测试点一直没有通过 后来在网上搜寻了一下答案 发现自己写的逻辑实在是太混乱了 所以看了一下别人的思路 主要是 1 首先判断坏键盘中是否有 若是有的话 使用flag标记一下 2 然后可以循环的判断应该输出的字符串 边遍历边输
  • 遗传算法及Python代码实现、图解

    目录 前言 一 遗传算法 Genetic Algorithm GA 简介 二 遗传算法基本概念 二 1 目标函数 环境 二 2 一组解 最优解 种群 最适宜种群 二 3 解 编码 个体 基因型 二 4 解码 表现型 难点 二 5 交叉 变异
  • 【jdk1.8特性】之Function

    笔者日常 来吧 Function 相关声明 本文按照以下顺序进行说明并给出简单的使用示例 序号 接口 1 Function