news 2026/5/3 10:46:07

Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程

Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程

1. 什么是函数式接口 (Functional Interface)?

函数式接口是只包含一个抽象方法的接口。它可以用 Lambda 表达式、方法引用或构造器引用进行实例化。

为了明确表示一个接口是函数式接口,通常使用@FunctionalInterface注解(非强制,但推荐)。

示例:定义一个简单的函数式接口

@FunctionalInterfacepublicinterfaceGreetingService{// 只有一个抽象方法voidgreet(Stringname);// 可以有默认方法和静态方法,不影响其作为函数式接口defaultvoidsayGoodbye(){System.out.println("Goodbye!");}}

2. 函数式接口的实现类

你可以像普通接口一样,创建一个具体的实现类来实现这个接口。

示例:通过普通类实现函数式接口

// 实现类classEnglishGreetingimplementsGreetingService{@Overridepublicvoidgreet(Stringname){System.out.println("Hello, "+name);}}// 使用publicclassMain{publicstaticvoidmain(String[]args){GreetingServiceservice=newEnglishGreeting();service.greet("Alice");// 输出: Hello, Alice}}

这种方式虽然可行,但在需要传递简单行为逻辑的场景下显得繁琐。


3. 通过匿名内部类 (Anonymous Inner Class) 实现函数式接口

在 Lambda 表达式出现之前,如果需要在代码中直接提供接口的实现,最常用的方式就是匿名内部类。

示例:使用匿名内部类

publicclassMain{publicstaticvoidmain(String[]args){// 创建一个匿名内部类来实现 GreetingService 接口GreetingServiceservice=newGreetingService(){@Overridepublicvoidgreet(Stringname){System.out.println("Hello from anonymous class, "+name);}};service.greet("Bob");// 输出: Hello from anonymous class, Bob}}
  • 优点:可以在需要时就地创建实现,无需预先定义一个类。
  • 缺点:代码冗长,包含了很多样板代码(new GreetingService() { ... }@Override),可读性较差。

4. 通过 Lambda 表达式 (Lambda Expression) 实现函数式接口

Lambda 表达式是 Java 8 引入的语法糖,它为函数式接口提供了更简洁、更优雅的实现方式。它的核心思想是“把功能(行为)当作参数”传递。

语法(parameters) -> { body }

演变过程

  1. 原始匿名内部类

    GreetingServiceservice=newGreetingService(){@Overridepublicvoidgreet(Stringname){System.out.println("Hello, "+name);}};
  2. 简化第一步:去掉外部结构
    因为编译器知道GreetingService是一个函数式接口,且只接受一个String参数,所以可以省略new GreetingService()@Override和方法名。

    // Lambda 表达式GreetingServiceservice=(Stringname)->{System.out.println("Hello, "+name);};
  3. 简化第二步:类型推断
    编译器可以从上下文 (GreetingService接口的greet方法签名) 推断出name的类型是String,因此可以省略参数类型。

    GreetingServiceservice=(name)->{System.out.println("Hello, "+name);};
  4. 简化第三步:单个参数的括号
    如果 Lambda 表达式只有一个参数,且类型已知,可以省略参数外的括号。

    GreetingServiceservice=name->{System.out.println("Hello, "+name);};
  5. 简化第四步:单行表达式体
    如果 Lambda 的主体只有一条语句,可以省略大括号{}return关键字(如果有返回值的话)。

    // 最终形态GreetingServiceservice=name->System.out.println("Hello, "+name);

完整示例:使用 Lambda 表达式

importjava.util.Arrays;importjava.util.List;publicclassMain{publicstaticvoidmain(String[]args){// 使用 Lambda 表达式创建实现GreetingServiceservice=name->System.out.println("Hello, "+name);service.greet("Charlie");// 输出: Hello, Charlie// --- Lambda 在实际应用中的强大之处 ---List<String>names=Arrays.asList("Alice","Bob","Charlie");// 将 Lambda 表达式作为参数传递给 forEach 方法// forEach 方法接收一个 Consumer<T> 类型的函数式接口names.forEach(name->System.out.println(name));// 上面这行代码等价于匿名内部类:/* names.forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }); */}}

总结:演变的核心思想

这个演变过程体现了从面向对象编程 (OOP)函数式编程 (FP)思想的融合。

  • 传统 OOP 方式:必须先创建一个类,然后实例化该类的对象来执行特定行为。
  • 匿名内部类:简化了 OOP 的流程,在需要的地方直接定义行为,但仍带有 OOP 的痕迹(如new,@Override)。
  • Lambda 表达式:彻底将行为本身(函数)作为第一等公民,直接传递给需要的地方,代码更加简洁、聚焦于“做什么”而非“如何做”。

这种演变极大地提高了代码的可读性和表达力,特别是在处理集合、事件监听等场景中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 13:05:43

java+vue基于springboot的星星行李寄存系统

目录系统概述技术栈核心功能系统优势应用场景开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 基于SpringBoot和Vue的星星行李寄存系统是一个现代化的Web应用&#xff0c;旨在为用户提供便捷的行李寄存服务。系统…

作者头像 李华
网站建设 2026/4/30 18:51:25

ReGLA Efficient Receptive-Field Modeling with Gated Linear Attention Network

ReGLA: Efficient Receptive-Field Modeling with Gated Linear Attention Network Authors: Junzhou Li, Manqi Zhao, Yilin Gao, Zhiheng Yu, Yin Li, Dongsheng Jiang, Li Xiao Deep-Dive Summary: Attention Is All You Need (Transformer) 论文总结 1. 摘要与背景 本文…

作者头像 李华
网站建设 2026/5/2 6:02:28

2025_NIPS_Boosting Resilience of Large Language Models through Causality-Driven Robust Optimization

文章核心总结与翻译 一、主要内容 该研究针对大型语言模型(LLMs)普遍存在的虚假相关性依赖和幻觉生成问题,提出了一种新的因果驱动鲁棒优化(CDRO)框架,核心目标是增强模型的因果推理能力,提升其可靠性和鲁棒性。 问题背景:LLMs常依赖训练数据中的表面统计模式(如共现…

作者头像 李华
网站建设 2026/4/28 14:40:10

谷歌seo服务费一般是多少?揭秘行业报价与避坑干货

说起谷歌SEO&#xff0c;很多老板第一反应就是&#xff1a;这玩意儿到底要花多少钱&#xff1f;去市场上问了一圈&#xff0c;结果更懵了。有的人说一个月两三千块钱就能搞定&#xff0c;还承诺你上首页&#xff1b;有的人一张嘴就是一年十几万&#xff0c;甚至几十万。这种巨大…

作者头像 李华
网站建设 2026/5/3 3:40:20

奇正沐古:靠谱的B2B行业品牌营销战略咨询公司

摘要&#xff1a;作为“AI色选沪市第一股”&#xff0c;合肥泰禾智能深耕色选机行业近20年&#xff0c;但受困于B2B工业品“关系营销”依赖、增速瓶颈与同质化竞争等难题。2021年底&#xff0c;泰禾智能与奇正沐古达成战略合作&#xff0c;后者以系统化品牌营销方法论&#xff…

作者头像 李华
网站建设 2026/5/3 6:17:59

六桂福萌宠乐园魔法季解锁首饰新玩法

在这个寻求治愈与美好的时代&#xff0c;甜蜜与童真成为人们心中最柔软的向往。而六桂福珠宝这个承载着二十来年匠心传承与情感温度的珠宝品牌&#xff0c;始终以“成为东方黄金美学集大成者”为愿景&#xff0c;不断探索珠宝与情感的交融点。六桂福珠宝自创立以来&#xff0c;…

作者头像 李华