概述

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接口,永远返回与自身类型相同的类型