概述
Function<T, R>
接口相当于一个类型转换的接口,通过R apply(T t)
方法,传入一个T
类型,返回一个R
类型,即:T
类型转换为R
类型
同类型接口,如IntFunction<R>
,通过规定R apply(int value)
方法传入int
类型,实现int
类型转换为R
类型
1.apply()方法使用
package com.message.demo.fun;
import com.alibaba.fastjson.JSON;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
public class TestFunction {
public static void main(String[] args) {
// 简单的转换为字符串函数
Function<Object, String> toString = s -> (s instanceof String) ? s.toString() : JSON.toJSONString(s);
String strToString = toString.apply("11111");
Map<String,String> map = new HashMap<>();
map.put("name", "Function");
String mapToString = toString.apply(map);
String listToString = toString.apply(Arrays.asList(1, 2, "3", 3, map));
System.out.println(strToString);
System.out.println(listToString);
System.out.println(mapToString);
}
}
输出:
11111
[1,2,"3",3,{"name":"Function"}]
{"name":"Function"}
2.静态方法identity()
static <T> Function<T, T> identity()
: 返回一个相同类型的Function对象,快速创建Function的方法
3.compose() 前置执行的转换方法
default <V> Function<V, R> compose(Function<? super V, ? extends T> before)
: 在本身定义的Function类型转换之前执行
例如:
public static void main(String[] args) {
Function<List<String>, String> listStringFunction = s -> {
System.out.println("将列表转换成字符串");
return String.join(",", s);
};
Function<List<Object>, List<String>> listFunction = list -> {
System.out.println("在转换之前运行,确保列表中都是字符串类型");
return list.stream().map(String::valueOf).collect(Collectors.toList());
};
String apply = listStringFunction.compose(listFunction).apply(Arrays.asList(1, 2, "3", 3));
System.out.println(apply);
}
执行结果如下:
在转换之前运行,确保列表中都是字符串类型
将列表转换成字符串
1,2,3,3
4.后置处理andThen()
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after)
: 在本身定义的Function类型转换之后,再执行andThen的函数
例如:
public static void main(String[] args) {
Function<List<String>, String> listStringFunction = s -> {
System.out.println("将列表转换成字符串");
return String.join(",", s);
};
String apply = listStringFunction.andThen(s -> "再次加工这个字符串:" + s).apply(Arrays.asList("j", "a", "v", "a"));
System.out.println(apply);
/*
执行结果:
将列表转换成字符串
再次加工这个字符串:j,a,v,a
*/
}
5,同类型的Function接口
-
BiFunction<T, U, R>
: 传入T类型和U类型,输出R类型。有andThen
方法 -
IntFunction<R>
: 将Int类型转换成R类型 -
DoubleFunction<R>
: 将Double类型转换成R类型 -
LongFunction<R>
: 将Long类型转换成R类型 -
ToDoubleBiFunction<T, U>
: 传入T类型和U类型, 输出Double类型 -
ToDoubleFunction<T>
: 传入T类型,, 输出Double类型 -
ToIntBiFunction<T, U>
: 传入T类型和U类型, 输出Int类型 -
ToIntFunction<T>
: 传入T类型, 输出Int类型 -
ToLongBiFunction<T, U>
: 传入T类型和U类型, 输出Long类型 -
ToLongFunction<T>
: 传入T类型, 输出Long类型 -
UnaryOperator<T> extends Function<T, T>
: 继承了Function接口,永远返回与自身类型相同的类型