Java 教程
- Java – 首页
- Java – 概述
- Java – 历史
- Java – 特性
- Java 与 C++
- JVM – Java 虚拟机
- Java – JDK 与 JRE 与 JVM
- Java – Hello World 程序
- Java – 环境搭建
- Java – 基本语法
- Java – 变量类型
- Java – 数据类型
- Java – 类型转换
- Java – Unicode 系统
- Java – 基本运算符
- Java – 注释
- Java – 用户输入
- Java – 日期与时间
Java 控制语句
- Java – 循环控制
- Java – 决策制定
- Java – if-else
- Java – switch
- Java – for 循环
- Java – for-each 循环
- Java – while 循环
- Java – do-while 循环
- Java – break
- Java – continue
面向对象编程
- Java – OOPs 概念
- Java – 对象与类
- Java – 类属性
- Java – 类方法
- Java – 方法
- Java – 变量作用域
- Java – 构造函数
- Java – 访问修饰符
- Java – 继承
- Java – 聚合
- Java – 多态
- Java – 重写
- Java – 方法重载
- Java – 动态绑定
- Java – 静态绑定
- Java – 实例初始化块
- Java – 抽象
- Java – 封装
- Java – 接口
- Java – 包
- Java – 内部类
- Java – 静态类
- Java – 匿名类
- Java – 单例类
- Java – 包装类
- Java – 枚举
- Java – 枚举构造函数
- Java – 枚举字符串
Java 内置类
Java 文件处理
Java 错误与异常
- Java – 异常
- Java – try-catch 块
- Java – try-with-resources
- Java – 多重 catch 块
- Java – 嵌套 try 块
- Java – finally 块
- Java – throw 异常
- Java – 异常传播
- Java – 内置异常
- Java – 自定义异常
Java 多线程
- Java – 多线程
- Java – 线程生命周期
- Java – 创建线程
- Java – 启动线程
- Java – 线程连接
- Java – 线程命名
- Java – 线程调度器
- Java – 线程池
- Java – 主线程
- Java – 线程优先级
- Java – 守护线程
- Java – 线程组
- Java – 关闭钩子
Java 同步
Java 网络编程
- Java – 网络编程
- Java – 套接字编程
- Java – URL 处理
- Java – URL 类
- Java – URLConnection 类
- Java – HttpURLConnection 类
- Java – Socket 类
- Java – 泛型
Java 集合
Java 接口
Java 数据结构
Java 集合算法
高级 Java
- Java – 命令行参数
- Java – Lambda 表达式
- Java – 发送邮件
- Java – Applet 基础
- Java – Javadoc 注释
- Java – 自动装箱和拆箱
- Java – 文件不匹配方法
- Java – REPL (JShell)
- Java – 多版本 Jar 文件
- Java – 私有接口方法
- Java – 内部类菱形运算符
- Java – 多分辨率图像 API
- Java – 集合工厂方法
- Java – 模块系统
- Java – Nashorn JavaScript
- Java – Optional 类
- Java – 方法引用
- Java – 函数式接口
- Java – 默认方法
- Java – Base64 编码解码
- Java – switch 表达式
- Java – Teeing 收集器
- Java – 微基准测试
- Java – 文本块
- Java – 动态 CDS 归档
- Java – Z 垃圾收集器 (ZGC)
- Java – 空指针异常
- Java – 打包工具
- Java – 密封类
- Java – 记录类
- Java – 隐藏类
- Java – 模式匹配
- Java – 简洁的数字格式化
- Java – 垃圾收集
- Java – JIT 编译器
Java 其他
- Java – 递归
- Java – 正则表达式
- Java – 序列化
- Java – 字符串
- Java – Process API 改进
- Java – Stream API 改进
- Java – 增强的 @Deprecated 注解
- Java – CompletableFuture API 改进
- Java – 流
- Java – 日期时间 API
- Java 8 – 新特性
- Java 9 – 新特性
- Java 10 – 新特性
- Java 11 – 新特性
- Java 12 – 新特性
- Java 13 – 新特性
- Java 14 – 新特性
- Java 15 – 新特性
- Java 16 – 新特性
Java API 与框架
Java 类引用
- Java – Scanner
- Java – 数组
- Java – 字符串
- Java – Date
- Java – ArrayList
- Java – Vector
- Java – Stack
- Java – PriorityQueue
- Java – LinkedList
- Java – ArrayDeque
- Java – HashMap
- Java – LinkedHashMap
- Java – WeakHashMap
- Java – EnumMap
- Java – TreeMap
- Java – IdentityHashMap
- Java – HashSet
- Java – EnumSet
- Java – LinkedHashSet
- Java – TreeSet
- Java – BitSet
- Java – Dictionary
- Java – Hashtable
- Java – Properties
- Java – Collection
- Java – Array
Java 有用资源
Java – Lambda 表达式
Java Lambda 表达式
Lambda 表达式在 Java 8 中引入,被誉为 Java 8 最大的特性。Lambda 表达式促进了函数式编程,并大大简化了开发。Lambda 表达式基于函数式接口的原理。函数式接口是一个接口,只有一个方法需要实现。Lambda 表达式提供了函数式接口方法的实现。
Lambda 表达式大大简化了函数式编程,并使代码更易读,无需任何样板代码。Lambda 表达式可以推断使用的参数类型,并且可以在没有 return 关键字的情况下返回值。对于简单的单语句方法,甚至可以省略大括号。
Lambda 表达式语法
Lambda 表达式的语法特征如下。
parameter -> expression body
Java Lambda 表达式的特性
以下是 Lambda 表达式的重要特性。
可选类型声明 – 无需声明参数的类型。编译器可以从参数的值中推断出来。
可选的参数圆括号 – 无需在圆括号中声明单个参数。对于多个参数,需要圆括号。
可选的大括号 – 如果表达式体包含单个语句,则无需使用大括号。
可选的 return 关键字 – 如果主体只有一个表达式来返回值,编译器会自动返回值。需要大括号来指示表达式返回值。
Java Lambda 表达式示例
在这个例子中,我们有一个函数式接口 MathOperation,它有一个 operate 方法,可以接受两个 int 参数,执行操作并将结果作为 int 返回。使用 lambda 表达式,我们创建了 MathOperation operate 方法的四个不同实现,用于添加、减去、乘以和除以两个整数并获得相应的结果。然后我们有另一个函数式接口 GreetingService,它有一个 sayMessage 方法,我们用它来打印消息到控制台。
package com.tutorialspoint; public class JavaTester { public static void main(String args[]) { JavaTester tester = new JavaTester(); //with type declaration MathOperation addition = (int a, int b) -> a + b; //with out type declaration MathOperation subtraction = (a, b) -> a - b; //with return statement along with curly braces MathOperation multiplication = (int a, int b) -> { return a * b; }; //without return statement and without curly braces MathOperation division = (int a, int b) -> a / b; System.out.println("10 + 5 = " + tester.operate(10, 5, addition)); System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction)); System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication)); System.out.println("10 / 5 = " + tester.operate(10, 5, division)); //without parenthesis GreetingService greetService1 = message -> System.out.println("Hello " + message); //with parenthesis GreetingService greetService2 = (message) -> System.out.println("Hello " + message); greetService1.sayMessage("Mahesh"); greetService2.sayMessage("Suresh"); } interface MathOperation { int operation(int a, int b); } interface GreetingService { void sayMessage(String message); } private int operate(int a, int b, MathOperation mathOperation) { return mathOperation.operation(a, b); } }
输出
让我们编译并运行上面的程序,这将产生以下结果:
10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello Mahesh Hello Suresh
以下是上述示例中需要注意的重要几点。
Lambda 表达式主要用于定义函数式接口的内联实现,即只有一个方法的接口。在上面的示例中,我们使用了各种类型的 lambda 表达式来定义 MathOperation 接口的 operation 方法。然后我们定义了 GreetingService 的 sayMessage 的实现。
Lambda 表达式消除了对匿名类的需求,并为 Java 提供了一种非常简单而强大的函数式编程能力。
Java Lambda 表达式的范围
使用 lambda 表达式,您可以引用任何 final 变量或有效 final 变量(只赋值一次)。如果变量第二次赋值,lambda 表达式会抛出编译错误。
在 Lambda 表达式中使用常量
在这个例子中,我们有一个函数式接口 GreetingService,它有一个 sayMessage 方法,我们用它来打印消息到控制台。现在在 Java Tester 类中,我们有一个 final 类字段 salutation,它的值是 "Hello! "。现在在 lambda 表达式中,我们可以在没有任何错误的情况下使用这个 final 字段。
在 Lambda 表达式中使用常量的示例
public class JavaTester { final static String salutation = "Hello! "; public static void main(String args[]) { GreetingService greetService1 = message -> System.out.println(salutation + message); greetService1.sayMessage("Mahesh"); } interface GreetingService { void sayMessage(String message); } }
输出
让我们编译并运行上面的程序,这将产生以下结果:
Hello! Mahesh
在集合中使用 Lambda 表达式
从 Java 8 开始,几乎所有集合都增强了对lambda表达式的支持,可以使用lambda表达式来执行集合操作。例如,迭代列表、过滤列表、排序列表等等。本例展示了如何使用lambda表达式迭代字符串列表并打印所有元素,以及如何打印列表中所有偶数。
在集合中使用Lambda表达式的示例
package com.tutorialspoint; import java.util.ArrayList; import java.util.List; public class JavaTester { public static void main(String args[]) { // prepare a list of strings List<String> list = new ArrayList<>(); list.add("java"); list.add("html"); list.add("python"); // print the list using a lambda expression // here we're passing a lambda expression to forEach // method of list object list.forEach(i -> System.out.println(i)); List<Integer> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); numbers.add(5); numbers.add(6); numbers.add(7); numbers.add(8); System.out.println(numbers); // filter the list using a lambda expression // here we're passing a lambda expression to removeIf // method of list object where we can checking // if number is divisible by 2 or not numbers.removeIf( n -> n%2 != 0); System.out.println(numbers); } }
输出
让我们编译并运行上面的程序,这将产生以下结果:
java html python [1, 2, 3, 4, 5, 6, 7, 8] [2, 4, 6, 8]