前面介绍了如何自己定义函数式接口,本文接续函数式接口的实现原理,阐述它在数组处理中的实际应用。数组工具Arrays提供了sort方法用于数组元素排序,可是并未提供更丰富的数组加工操作,比如从某个字符串数组中挑选符合条件的字符串并形成新的数组。现在就让我们从零开始,利用函数式接口实现数组元素筛选的功能。
首先要定义一个字符串的过滤器接口,该接口内部声明了一个用于字符串匹配的抽象方法,由此构成了如下所示的函数式接口代码:
//定义字符串的过滤接口
public interface StringFilter {
// 声明一个输入参数只有源字符串的抽象方法
public boolean isMatch(String str);
}
接着编写一个字符串处理工具类,在工具类里面定义一个字符串数组的筛选方法select,该方法的输入参数包括原始数组和过滤器实例,方法内部根据过滤器的isMatch函数判断每个字符串是否符合筛选条件,并把所有符合条件的字符串重新生成新数组。按此思路实现的工具类代码如下所示:
//定义字符串工具类
public class StringUtil {
// 根据过滤器StringFilter从字符串数组挑选符合条件的元素,并重组成新数组返回。
// 其中StringFilter只对字符串元素自身进行校验。
public static String[] select(String[] originArray, StringFilter filter) {
int count = 0;
String[] resultArray = new String[0];
for (String str : originArray) { // 遍历所有字符串
if (filter.isMatch(str)) { // 符合过滤条件
count++;
// 数组容量增大一个
resultArray = Arrays.copyOf(resultArray, count);
// 往数组末尾填入刚才找到的字符串
resultArray[count-1] = str;
}
}
return resultArray;
}
}
然后在外部构建原始的字符串数组,并通过StringUtil工具的select方法对其进行数据挑选。为了能看清过滤器实例的完整面貌,一开始还是以匿名内部类形式声明,这样外部的调用代码示例如下:
// 在挑选符合条件的数组元素时,可采取方法引用
private static void testSelect() {
// 原始的字符串数组
String[] strArray = { "Hello", "world", "What", "is", "The", "Wether", "today", "" };
// 筛选后的字符串数组
String[] resultArray;
// 采取匿名内部类方式筛选字符串数组
resultArray = StringUtil.select(strArray, new StringFilter() {
@Override
public boolean isMa