当前位置: 代码迷 >> 综合 >> Java8 Functional Interface写给自己的小白函数式接口说明
  详细解决方案

Java8 Functional Interface写给自己的小白函数式接口说明

热度:41   发布时间:2023-11-24 20:31:36.0

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 视频学习资料!

  相关解决方案