import java.util.function.Function;
public class UserFunction {
public static void main(String[] args) {
/**
* Function接口的主要作用是将一个给定的对象进行加工,然后返回加工后的对象,这个加工可以是任何操作.
*
* 其核心方法如下:
* R apply(T t); 将一个给定的对象进行加工,然后返回加工后的对象,可以将该方法理解为一个一维函数,参数R是自变量,参数T是因变量.
* default <V> Function<V, R> compose(Function<? super V, ? extends T> before) 组合函数,在调用当前function之前执行
* default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) 组合函数,在调用当前function之后执行
* static <T> Function<T, T> identity() 原函数,返回与参数一致的函数,即可以理解为 y = x
*
*
*
* 与Function接口相关的接口:
* BiFunction<T, U, R> 二维函数,可以理解成 z = kx + by,即对给定的两个参数U,R进行加工,生产T
* DoubleFunction<R> 用于处理处理将其他类型转成double类型数据的Function
* IntFunction<R> 用于处理处理将其他类型转成int类型数据的Function
* LongFunction<R> 用于处理将其他类型转成long类型数据的Function
* LongToIntFunction 用于处理将long转换成int的Function
* LongToDoubleFunction 用于处理将long转换成double的Function
* ToDoubleBiFunction<T, U> 用于处理将给定两个参数T,U转换成double类型的BiFunction
* ToDoubleFunction<T> 用于处理将其他类型转换成double的Function
* ToIntBiFunction<T, U> 用于处理将给定两个参数T,U转换成int类型的BiFunction
* ToIntFunction<T> 用于处理将其他类型转换成int的Function
* ToLongBiFunction<T, U> 用于处理将给定两个参数T,U转换成long类型的BiFunction
* ToLongFunction<T> 用于处理将其他类型转换成long的Function
*/
// identity():可以看到identity()返回的值与原值是一致的.
Function<Object, Object> function = Function.identity();
System.out.println(function.apply(100)); // 100
System.out.println(Function.identity().apply(100111)); // 100111
Person person = new Person();
System.out.println(person == Function.identity().apply(person)); // true
// andThen():用Function.andThen()来实现一个函数:y = 10x + 10;
Function<Integer, Integer> function = x -> x * 10;
function = function.andThen(x -> x + 10);
System.out.println(function.apply(8)); // 90
// compose():用Function.compose()来实现一个函数:y = 10 (10+x) + 10;
Function<Integer, Integer> function = (x -> x * 10);
function = function.compose(x -> x + 10);
function = function.andThen(x -> x + 10);
System.out.println(function.apply(8)); // 190
}
}