Java泛型函数

August 21, 2017

背景

PHP的Array以方便灵活著称,再加上丰富的库函数,可以让开发者灵活的应对大部分需求。经常和数据库打交道的同学,肯定熟悉这个方法array_column

array_column() 返回input数组中键值为column_key的列, 如果指定了可选参数index_key,那么input数组中的这一列的值将作为返回数组中对应值的键。

做Java后,我们也常碰到需要如此操作的场景,但并没有合适的库函数,于是本着解放劳动力的出发点,打算自己开发一个。但是由于Java是一个强类型语言,我们经常会碰到如此的类型List<T>,如下:

public class UserInfo {
    private String userName = "codecooker";
    private Integer age = 18;
}


public class school {
    private List<UserInfo> students;


    public List<String> getStudentNameList() {
        // 原始的做法,我们需要遍历
        List<String> studentName = new ArrayList<>();
        for (UserInfo usInfo : this.students) {
            studentName.add(usInfo.userName);
        }

        return studentName;
    }
}

泛型方法

解决方案是由于看到系统函数的实现有所启发,想到了泛型函数。下面从自己的理解对泛型函数做一个简单的解释
一般的泛型函数形式如下:
session的工作机制 其中
1表示在此泛型函数中我们定义要使用的泛型,这里只代表一个符号,可以试T也可以是
2表示该泛型函数的返回类型,必须是已经定义过的类型,比如是T或者U
3方法名
45参数列表
这里需要注意区分泛型方法和不同泛型类内使用泛型的方法的区别,例如:

public class Test<T> {
    // 泛型方法
    public static <T,U> List<T> clounms(List<U> list, Function<U,T> function);

    // 不同类成员方法,只不过是返回了一个类定义时的泛型列表
    public List<T> getALl();
}

其实,按照我的理解,最重要的区别就是是否有在方法定义时有泛型的定义过程,如果有则是泛型方法。

实现array_column方法

有了上面的铺垫,我们可以定义简单的泛型方法来实现array_column的功能

public class ListUtil {

    public static <T,U> List<T> clounms(List<U> list, Function<U,T> function) {
        List<T> result = new ArrayList<>();
        for (U u :
                list) {
            result.add(function.apply(u));
        }

        return result;
    }
}

如此,完成

Comments