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> 输入到操作的类型
*/
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
1. 实例
@Test
public 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 返回结果的类型
*/
@FunctionalInterface
public interface Supplier<T> {
T get();
}
1. 实例
产生指定个数的随机整数,并放入到集合中
@Test
public 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> 函数的返回类型
*/
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
1. 实例
根据规则处理字符串
@Test
public 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> 被判断对象的类型
*/
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
1. 实例
过滤满足条件的整数并返回
@Test
public 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, U |
R | 对类型为 T, U 参数应用操作,返回 R 类型的结果,包含方法为 R apply(T t,U u) |
UnaryOperator<T> (Function 子接口) |
T |
T |
对类型为 T 的对象进行一元运算,并返回 T 类型的结果,包含方法为 T apply(T t) |
BinaryOperator<T> (BiFunction 子接口) |
T, T |
T |
对类型为 T 的对象进行二元运算,并返回 T 类型的结果,包含方法为 T apply(T t1, T t2) |
BiConsumer<T, U> |
T, U |
void |
对类型为 T, U 应用操作,包含方法为 void accept(T t, U u) |
ToIntFunction<T> |
T |
int |
计算 int 值得函数 |
ToLongBiFunction<T, U> |
T |
long |
计算 long 值得函数 |
ToDoubleFunction<T> |
T |
double |
计算 double 值得函数 |
IntFunction<R> |
int |
R |
参数为 int 类型的函数 |
LongFunction<R> |
long |
R |
参数为 long 类型的函数 |
DoubleFunction<R> |
double |
R |
参数为 double 类型的函数 |
转载请注明出处:
文章地址:Java 8 新特性之函数式接口
文章作者:凌风
原始连接:https://lingfeng.me/blog/java/java8-func/
许可协议:转载请注明原文链接及作者。