1. 概述1.1 简介在开发中使用 Lambda 表达式时,我们如果每次都自己定义函数接口也是一件很麻烦的事情,所以java 8 已经提供了一个函数式接口供我们来使用。最常用的接口包括 Function<T, R>、Predicate<T> 、Supplier<T> 和 Consumer<T>,它们是在 java.util.function 包中定义的,平常基本的使用都是可以满足的,如果再有其它满足不了的需求,再进行自定义接口2. 内置函数接口2.1 Consumer<T> 消费型接口只有一个参数,且没有返回值的函数/** * 表示接受单个输入参数且不返回结果的操作。 * * @param <T> 输入到操作的类型 /@FunctionalInterfacepublic interface Consumer<T> { void accept(T t);}1. 实例@Testpublic void t1(){ handle(100,(x) -> System.out.println(“handle result : " + x * x));}public void handle(Integer m,Consumer<Integer> consumer) { consumer.accept(m);}2.2 Supplier<T> 供给型接口没有参数,且只有一个返回值的函数/* * 表示结果的提供者。 * * 没有要求每次调用供应商时都返回一个新的或不同的结果。 * * @param <T> supplier 返回结果的类型 /@FunctionalInterfacepublic interface Supplier<T> { T get();}1. 实例产生指定个数的随机整数,并放入到集合中@Testpublic void t2(){ List<Integer> list = getRandomNumList(10,() -> (int)(Math.random() * 100)); System.out.println(list.toString());}public List<Integer> getRandomNumList(Integer limit, Supplier<Integer> supplier) { List<Integer> list = new ArrayList<>(); for (int i = 0 ; i < limit ; i++){ list.add(supplier.get()); } return list;}2.3 Function<T, R> 函数型接口有一个参数和一个返回值的函数/* * 表示接受一个参数并生成结果返回的函数。 * * @param <T> 函数的输入类型 * @param <R> 函数的返回类型 /@FunctionalInterfacepublic interface Function<T, R> { R apply(T t);}1. 实例根据规则处理字符串@Testpublic void t3() { // 去除空格 String str = strHandler(” abcdef “,(x) -> x.trim()); System.out.println(”" + str + “*”);}/** * 根据规则处理字符串 * * @param str 待处理字符串 * @param func Function 函数 * @return 处理结果 /public String strHandler(String str, Function<String,String> func) { return func.apply(str);}2.4 Predicate<T> 断言型接口/* * 布尔值函数。 * * @param <T> 被判断对象的类型 /@FunctionalInterfacepublic interface Predicate<T> { boolean test(T t);}1. 实例过滤满足条件的整数并返回@Testpublic void t4() { List<Integer> initList = Arrays.asList(3,2,45,32,1,30,10,49,48,6,7,0,8); List<Integer> list = filterNum(initList,(x) -> x > 10); System.out.println(“list : " + list.toString());}/* * 过滤满足条件的整数并返回 * * @param list * @param predicate * @return */public List<Integer> filterNum(List<Integer> list, Predicate<Integer> predicate) { List<Integer> resList = new ArrayList<>(); for (int i : list) { if (predicate.test(i)) { resList.add(i); } } return resList;}2.5 其他接口函数式接口参数类型返回类型用途BiFunction<T, U, R>T, UR对类型为 T, U 参数应用操作,返回 R 类型的结果,包含方法为 R apply(T t,U u)UnaryOperator<T> (Function 子接口)TT对类型为 T 的对象进行一元运算,并返回 T 类型的结果,包含方法为 T apply(T t)BinaryOperator<T> (BiFunction 子接口)T, TT对类型为 T 的对象进行二元运算,并返回 T 类型的结果,包含方法为 T apply(T t1, T t2)BiConsumer<T, U>T, Uvoid对类型为 T, U 应用操作,包含方法为 void accept(T t, U u)ToIntFunction<T>Tint计算 int 值得函数ToLongBiFunction<T, U>Tlong计算 long 值得函数ToDoubleFunction<T>Tdouble计算 double 值得函数IntFunction<R>intR参数为 int 类型的函数LongFunction<R>longR参数为 long 类型的函数DoubleFunction<R>doubleR参数为 double 类型的函数本文首发于凌风博客:Java 8 函数式接口作者:凌风