Java 函数接口Function详解与示例【函数接口Function】
Java 8引入了一种新的函数式编程风格,Function接口是Java函数式编程中最重要的四个函数式接口之一。
Function 函数式接口实现的功能:接受一个输入参数,然后产生一个输出结果。Function接口在java.util.function包中定义,它的源码如下:
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Function
/**抽象方法*/
R apply(T t);
default
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
static
return t -> t;
}
}
Function 接口是非常有用的,它是Java函数式编程中最重要的四个函数式接口中使用最为广泛的。
用途一:函数转换Function可以用于将一个类型的值转换为另一个类型的值。它可以用于各种转换操作,如类型转换、数据映射map等。
用途二:数据处理Function 可用于对输入数据进行处理并生成输出结果。它可以用于执行各种操作,如过滤filter、计算、提取、格式化等。
Function接口定义的方法:
抽象方法: R apply(T t),该方法接受一个参数 t(类型为 T),并返回一个结果(类型为 R)。也就是说,接受一个类型 T 的输入数据 ,经过转换后返回一个类型 R 的数据。
默认方法: Function
使用andThen方法将多个函数应用于同一个输入:
Function
Function
Function
String result = combined.apply("Hello"); // 结果为 "Hello world!"
默认方法:Function
Function
Function
/***注意:这里故意调换了两个函数的调用顺序***/
Function
String result = combined.apply("Hello"); // 结果为 "Hello world!"
静态方法: Function
当我们使用Stream时,要将流中元素转换成其他容器或Map时,就会使用到Function.identity()。例如:
Stream
Map
Function.identity()应用示例
下面的代码中,Task是一个对象,它包含Title等属性,Task::getTitle可获取task实例的标题作为Map的key,我们把task对象本身作为Map的value。task -> task是一个用来返回输入参数自身的Lambda表达式。我们来对比一下,使用Lambda表达式和使用Function.identity()方法的用法:
/***使用Lambda表达式实现的版本***/
private static Map
return tasks.stream().collect(toMap(Task::getTitle, task -> task));
}
可以使用Function接口中的静态方法identity()来让上面的代码代码变得更简洁明了、传递开发者意图时更加直接。使用Function.identity()方法的写法:
/***使用Function.identity()方法实现的版本***/
import static java.util.function.Function.identity;
private static Map
return tasks.stream().collect(toMap(Task::getTitle, identity()));
}
Function.identity() 和 Lambda表达式( t->t ) 的区别的应用示例
下面三种写法实现相同功能,这是Function.identity() 和 Lambda表达式( t->t )可以互相替代的情形:
/***写法一***/
Arrays.asList("How", "much", "is","the","apple")
.stream()
.collect(Collectors.toMap( str -> str, str->str.length()));
/***写法二,Lambda表达式( t->t )版本***/
Arrays.asList("How", "much", "is","the","apple")
.stream()
.map(str -> str) //Lambda表达式( t->t )
.collect(Collectors.toMap(str -> str,str->str.length())); //String::length
/***写法三,Function.identity()版本***/
Arrays.asList("How", "much", "is","the","apple")
.stream()
.map(Function.identity()) //Function.identity()版本
.collect(Collectors.toMap( Function.identity(), String::length));
下面看一种 Function.identity() 和 Lambda表达式( t->t )不能互相替代的情形:这儿使用 Lambda表达式( t->t )可行:
int[] iArr = Arrays.asList(5, 9, 12,3).stream().mapToInt(t->t).toArray();
但是,如下使用 Function.identity() 是不行的:
int[] iArr = Arrays.asList(5, 9, 12,3).stream().mapToInt( Function.identity() ).toArray();
为什么不行呢?其本质是 Function.identity(), Function
Function接口的应用实例使用Function接口作为方法的参数:
void process(Function
String result = function.apply(input);
System.out.println(result);
}
process(s -> s + "!", "Hello"); // 输出 "Hello!"
使用Java 8的Stream API进行映射:
List
List
.map(s -> s + "!")
.collect(Collectors.toList());
// 结果为 ["a!", "b!", "c!"]
Function函数接口有一大家族,如下所示:
参考文献:【Java函数篇】Java8中函数接口Function使用详解Java 8 Function 函数接口Function.identity()的使用详解Java8中Function函数式接口详解及使用Java8中Function接口的使用方法详解Java 8 新特性—函数式接口【函数接口与方法引用】Java 中的方法引用
Java 函数接口Function详解与示例【函数接口Function】_java function-CSDN博客