java8 Function how to use
Function<T,R> 接口,内置的函数接口,其接受两个参数,一个入参T,一个出参R
拼接字符串
举例:假如一个方法是用来拼接字符串的,需要的入参是String类型的,出参也是String类型的。
非java8时你可能会这样写:1
2
3
4
5
6public String appendStr(String oriStr, String appendStr) {
return oriStr + appendStr;
}
//使用;
String result = appendStr("hello", " world !");
从上面可以明确的看出 它的入参和出参都是String,用Function就可以这样写:
1 | public String appendStr(String oriStr, Function<String, String> strFunction) { |
上面举了一个比较简单的例子,便于理解Function接口的使用。
元素是否存在
举例:查找某一个元素是否在列表中存在
非java8 时你可能会这样写:1
2
3
4
5
6
7
8
9
10
11
12
13public static <T> boolean isExist(Collection<T> list, T t) {
if (CollectionUtils.isEmpty(list)) {
return false;
}
for (T t1 : list) {
if (t1.equals(t)) {
return true;
}
}
return false;
}
从上面可以看到,需要传入一个list,和要查询的目标值,这样判断逻辑都在其中,不利于扩展,其实我们只需要知道一个元素是否在这个元素是否在这个list中,在的话返回true,不在的话返回false, 所以我们可以把具体的操作抽象为一个返回值为Boolean的接口,具体的实现由具体的实现类去实现或内部类去实现。
1 | // 定义一个接口 |
上面我们已经将判断的部分抽象为了接口,将判断的逻辑放在了传参出,内部只需要知道你的结果是true还是false就足够了,可以看到这个接口需要一个入参为T,返回参数为Boolean,这时Function恰好可以满足,我们就不必自定义函数接口了。
1 | public static <T> boolean isExist(Collection<T> list, Function<T, Boolean> function) { |
查找list中的某个元素,并返回此元素
举一反三,如何查询一个元素是否存在于某个list中呢?如果存在的话则返回这个元素1
2
3
4
5
6
7
8
9
10
11public static <T> T findData(Collection<T> list, Function<T, Boolean> function) {
if (CollectionUtils.isEmpty(list)) {
return null;
}
for (T t : list) {
if (function.apply(t)) {
return t;
}
}
return null;
}
总结:
1 | 其实 match.test 调用的就是`Predicate`中的`test`方法, t为传给`Predicate`的参数 |
Function<T,R> 函数式接口,T代表入参,R代表出参,当你的函数有出参和入参时都可使用此接口,当然java8还提供了许多类似的函数式接口来方便我们的使用,以后再来总结。