• java8 function接口浅析(个人见解,如有错误,还请指正)


    先引入一篇介绍的文章:JDK8 函数式接口 -干货使用Function 详细讲解快速上手
    案例转载自大佬文章


    JDK8的function接口,里面包含四个方法apply andThen composeidentity

    1. apply方法
      案例
    public class FunctionOneExample{
      public static void main(String args[]){
        Function<User, String> funcUserToString= (User e)-> {return e.getName();};
        List<User> UserList= 
         Arrays.asList(new User("A-0", 13), 
          new User("A-1", 25),
          new User("B-2", 10),
          new User("C-3", 15),
          new User("D-4", 29));
        List<String> userNameList=convertUserListToNamesList(UserList, funcUserToString);
        userNameList.forEach(System.out::println);
     }
     public static List<String> convertUserListToNamesList(List<User> UserList, Function<User, String> funcUserToString){
       List<String> userNameList=new ArrayList<String>(); 
       for(User user:UserList){
         userNameList.add(funcUserToString.apply(user));
       }
       return userNameList;
      }
    }
    输出结果:
    A-0
    A-1
    B-2
    C-3
    D-4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    Function 的意思是将User类映射成String类型。
    函数“funcUserToString”的内容是返回User的name。
    funcUserToString.apply(user)的意思调用这个函数,得到函数返回的映射值。

    1. andThen()方法
      案例
    public class FunctionAndThenOneExample{
      public static void main(String args[]){
        Function<User, String> funcUserToString= (User e)-> {return e.getName();};
        List<User> UserList=
         Arrays.asList(new User("Tike-one", 13), 
          new User("Hello-world", 25),
          new User("Earth-one", 10),
          new User("Nanshou-one", 15),
          new User("Dogkeep-one", 29));
        Function<String,String> initialFunction= (String s)->s.substring(0,1);
        List<String> userNameListInitials=convertUserListToNamesList(UserList, funcUserToString.andThen(initialFunction));
        userNameListInitials.forEach(str->{System.out.print(" "+str);});
     }
      public static List<String> convertUserListToNamesList(List<User> UserList, Function<User, String> funcUserToString){
       List<String> userNameList=new ArrayList<String>(); 
       for(User user:UserList){
         userNameList.add(funcUserToString.apply(user));
       }
       return userNameList;
      }
    }
    
    输出结果:
    T H E N D
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    UserList, funcUserToString.andThen(initialFunction):在函数funcUserToString.apply(user)的时候,先执行main方法里的funcUserToString,获取到了用户名,然后调用initialFunction函数截取第一个字符。
    文档定义如下:
    在这里插入图片描述
    也就是说,after函数会在函数调用后再调用。

    1. Compose()方法
      案例
    public class FunctionComposeExample{
      public static void main(String args[]){
        Function<User, String> funcUserToString= (User e)-> {return e.getName();};
        Function<User, User> funcuserFirstName= 
         (User e)-> {int index= e.getName().indexOf("-");
                     String firstName=e.getName().substring(0,index);
                     e.setName(firstName);
                     return e;};
        List<User> UserList=
          Arrays.asList(new User("Tike one", 13), 
           new User("Hello-world", 25),
           new User("Earth-one", 10),
           new User("Nanshou-one", 15),
           new User("Dogkeep-one", 29));
        List<String> userFirstNameList= convertUserListToNamesList(UserList,funcUserToString.compose(funcuserFirstName));
        userFirstNameList.forEach(str->{System.out.print(" "+str);});
      }
     public static List<String> convertUserListToNamesList(List<User> UserList, Function<User, String> funcUserToString){
       List<String> userNameList=new ArrayList<String>(); 
       for(User user:UserList){
         userNameList.add(funcUserToString.apply(user));
       }
       return userNameList;
      }
    }
    结果
    Tike Hello Earth Nanshou Dogkeep
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    funcUserToString.compose(funcuserFirstName):和andThen方法相反,compose方法会先执行参数里的函数funcuserFirstName,然后将得到的结果返回给funcUserToString。
    文档定义如下:
    在这里插入图片描述
    先执行函数before,得到的结果返回给调用函数。

    1. identity()方法
      案例
    public class FunctionTRIdentityExample{
      public static void main(String args[]){
        List UserList=
         Arrays.asList(new User("Tike-one", 13), 
          new User("Hello-world", 25),
          new User("Earth-one", 10),
          new User("Nanshou-one", 15),
          new User("Dogkeep-one", 29));
        List userNameListInitials=applyIdentityTouserList(UserList, Function.identity());
        userNameListInitials.forEach(System.out::println);
     }
      public static List applyIdentityTouserList(List UserList, Function funcuserTouser){
       List userNameList=new ArrayList(); 
       for(User user:UserList){
         userNameList.add(funcuserTouser.apply(user));
       }
       return userNameList;
      }
    }
    结果
    User Name:Tike-one Age:13
    User Name:Hello-world Age:25
    User Name:Earth-one Age:10
    User Name:Nanshou-one Age:15
    User Name:Dogkeep-one Age:29
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    Function.identity():调用该静态方法,返回类名以及成员变量和值。
    文档说明:
    在这里插入图片描述

  • 相关阅读:
    Android MediaCodec将h264实时视频流数据解码为yuv,并转换yuv的颜色格式为nv21
    RocketMQ实践与原理分析(Docker安装RocketMQ)
    LCR 059.数据流中的第 K 大元素
    Docker Tutorial
    MyEclipse个人长久使用方法
    第四节 Electron 调用H5事件结合node模块fs 实现文件拖拽读取
    RabbitMQ 利用DelayExchange插件实现延迟队列
    LLM(大语言模型)解码时是怎么生成文本的?
    transformers生成式对话机器人
    【后端面经-Java】HashMap详解
  • 原文地址:https://blog.csdn.net/weixin_44048668/article/details/126508300