• 预定义的函数式接口 Function


    
    

    函数接口: Function<T, R> 

    方法定义: R apply(T t);

    说明: 函数转换,输入类型T,输出类型R

    接口源码

     @FunctionalInterface
        public interface Function<T, R> {
            
            /**
             * 抽象方法: 根据一个数据类型T加工得到一个数据类型R
             */
            R apply(T t);
    
            /**
             * 组合函数,调用当前function之前调用
             */
            default <V> java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T> before) {
                Objects.requireNonNull(before);
                return (V v) -> apply(before.apply(v));
            }
    
            /**
             * 组合函数,调用当前function之后调用
             */
            default <V> java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V> after) {
                Objects.requireNonNull(after);
                return (T t) -> after.apply(apply(t));
            }
    
            /**
             *  静态方法,返回与原函数参数一致的结果。x=y
             */
            static <T> java.util.function.Function<T, T> identity() {
                return t -> t;
            }
        }

    Function示例

    定义一个学生类Student,它有name和score两个属性,如下所示。

    @Setter
    @Getter
    public class Student {
    
        String name;
    
        double score;
    
        public Student(String name, double score) {
            this.name = name;
            this.score = score;
        }
    }

     列表处理的一个常见需求是转换。比如,给定一个学生列表,需要返回名称列表,或者将名称转换为大写返回,可以借助Function写一个通用的方法,如下所示:

    public static <T, R> List<R> map(List<T> list, Function<T, R> mapper) {
        List<R> retList = new ArrayList<>(list.size());
        for (T e : list) {
            retList.add(mapper.apply(e));
        }
        return retList;
    }
    public static void main(String[] args) {
    
        List<Student> students = Arrays.asList(new Student[]{
                new Student("zhangsan", 80d),
                new Student("lisi", 89d),
                new Student("wangwu", 98d)});
    
        // 将学生名称转换为大写的代码为:
        Function<Student, Student> function = t -> new Student(t.getName().toUpperCase(), t.getScore());
        List<Student> students_1 = map(students, function);
        System.out.println("students_1:" + students_1.toString());
    
        // 根据学生列表返回分数列表的代码为:
        Function<Student, Double> function2 = t -> t.getScore();
        List<Double> scores = map(students, function2);
        System.out.println("scores:" + scores.toString());
    
        // andThen 示例
        Function<Student, Double> function3 = function2.andThen(x -> x + 10);
        List<Double> scores_2 = map(students, function3);
        System.out.println("scores_2:" + scores_2.toString());
    
    }
  • 相关阅读:
    linux笔记:用户管理命令和用户组管理命令
    linux笔记:用户配置文件
    linux笔记:关机重启命令shutdown,系统运行级别init,退出登录logout
    linux笔记:网络命令ping,traceroute,ifconfig,netstat;挂载和卸载命令mount,umount
    归纳和数学归纳法
    linux笔记:压缩解压命令gzip,gunzip,tar,zip,unzip,bzip2,bunzip2
    linux笔记:linux帮助命令,man,help,whatis,apropos
    linux笔记:搜索命令find,locate,which,whereis,grep
    linux笔记:权限管理命令chmod,chown,chgrp,umask
    linux笔记:链接命令,软链接和硬链接
  • 原文地址:https://www.cnblogs.com/ooo0/p/13691124.html
Copyright © 2020-2023  润新知