1 什么是函数式接口
函数式接口 (Functional Interface)
就是 有且仅有一个抽象方法,但是 可以有多个非抽象方法的接口。通常 Lambda
表达式在函数式接口上使用的
Java8
引入 @FunctionalInterface
注解声明该接口是一个函数式接口。比如常用的 Consumer
接口:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
2 函数式接口实例
Java8
其实已经为我们定义好了 最常用的四类内置函数式接口
函数式接口 | 入参类型 | 返回类型 | 作用示例 |
---|---|---|---|
Consumer | T | void | Stream.peek() |
Supplier | T | Stream.generate() | |
Function | T | R | Stream.map() |
Predicate | T | boolean | Stream.filter() |
2.1 消费型接口 Consumer < T >
定义了
void accept(T t)
,只接收一个参数T,无返回值。比如:??
只会将money进行打印,将 System.out.println(x) 进行消费,就没有剩余操作了
public void testConsumer() {
testConsumerRealize(1000, x -> System.out.println(x));
}public void testConsumerRealize(double money, Consumer<Double> con) {
con.accept(money);
}
2.2 供给型接口 Supplier < T >
定义了
T get()
,将生产的数据返回,返回值即生产的数据。比如:??
将 (int) Math.random() * 100 产生的数据通过 .get()获取到
public void testSupplier() {
List<Integer> list = getNumList(5, () -> (int) Math.random() * 100);list.forEach(System.out::println);
}public List<Integer> getNumList(int maxSize, Supplier<Integer> supplier) {
List<Integer> list = new ArrayList<>(maxSize);for (int i = 0; i < maxSize; i++) {
Integer n = supplier.get();list.add(n);}return list;
}
2.3 函数型接口 Function < T, R >
定义了
R apply(T t)
, 入参接受范性T
对象, 然后返回范性R
对象,这种一般称之为 功能型接口。比如:??
这段程序就是将字符串 " 百万 龙台 " 前后空格去除,返回一个新的字符串对象
public void testFunction() {
String resultStr = strTrim(" 百万 龙台 ", str -> str.trim());System.out.println(resultStr);
}public String strTrim(String str, Function<String, String> fun) {
return fun.apply(str);
}
2.4 断言型接口 Predicate < T >
定义了
boolean test(T t)
,满足条件则为 True,反之则为 False。比如:??
此段代码程序如果initList中的元素符合 .length() > 3,则加入到返回集合中
public void testPredicate() {
List<String> initList = Arrays.asList("马百万", "马龙台", "马学习", "马天天学习");List<String> resultList = filterStr(initList, (s) -> s.length() > 3);resultList.forEach(each -> System.out.println(each));
}public List<String> filterStr(List<String> list, Predicate<String> pre) {
List<String> strings = new ArrayList<>();for (String string : list) {
if (pre.test(string)) {
strings.add(string);}}return strings;
}
3 自定义函数式接口
3.1 定义函数式接口
/*** 对象转换** @author MaLongT* @date 2019/12/6 下午1:00*/
@FunctionalInterface
public interface ConvertFunction<R, T> {
R convert(T t);}
3.2 定义测试方法
其实这个
Demo
是和Function < T, R >
用法和语义都是一致的。如果明白了原理,那么实现不同的函数式接口都是可以的
会将字符串 “1” 转换成 数值类型的 1 进行打印输出
public void testConvert() {
Integer resultInt = testConvertRealize("1", s -> Integer.valueOf(s));System.out.println(resultInt);
}public Integer testConvertRealize(String source, ConvertFunction<Integer, String> convertFunction) {
Integer target = convertFunction.convert(source);return target;
}
微信搜索【源码兴趣圈】,关注龙台,回复【资料】领取涵盖 GO、Netty、SpringCLoud Alibaba、Seata、开发规范、面试宝典、数据结构等电子书 or 视频学习资料!