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 - Datetime 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 - 方法引用
方法引用是在 Java 8 中引入的。方法引用是 lambda 表达式 的一种特殊类型。它通过提高可读性和编写简洁的代码来满足 lambda 表达式的目的。
方法引用适用于 函数式接口。无论何时,我们都使用 lambda 表达式调用函数式接口的方法,都可以使用方法引用。
方法引用有助于通过名称指向方法,即使不指定参数。参数由 lambda 表达式传递。方法引用使用 "::" 符号描述。
Java 方法引用的类型
方法引用可以用于指向以下类型的方法:
静态方法
实例方法
使用 new 运算符的构造函数 (TreeSet::new)
静态方法的方法引用
静态 方法 可以轻松地使用 "::" 符号引用,而无需创建 类 的任何实例,并使用类名。
语法
<<class-name>>::methodName
示例:静态方法的引用
在此示例中,我们引用了我们类的静态方法以三种方式打印元素。第一种方法是使用 for 循环 打印元素的常规方法。第二种方法是在 for each 循环 中使用 lambda 表达式。第三种方法是在 for each 循环中使用方法引用来打印所有元素。
package com.tutorialspoint; import java.util.ArrayList; import java.util.List; public class Tester { public static void main(String args[]) { List<String> names = new ArrayList<>(); names.add("Mahesh"); names.add("Suresh"); names.add("Ramesh"); names.add("Naresh"); names.add("Kalpesh"); System.out.println("Printing using for each loop"); // Approach 1: for loop to print all elements for (String name: names) { System.out.println(name); } System.out.println("Printing using for each loop with lambda expression"); // Approach 2: lambda expression to print the elements in for each loop names.forEach(s->System.out.println(s)); System.out.println("Printing using for each loop with method reference" ); // Approach 3: Method reference to print elements in for each loop names.forEach(System.out::println); } }
输出
让我们编译并运行上述程序,这将产生以下结果:
Printing using for each loop Mahesh Suresh Ramesh Naresh Kalpesh Printing using for each loop with lambda expression Mahesh Suresh Ramesh Naresh Kalpesh Printing using for each loop with method reference Mahesh Suresh Ramesh Naresh Kalpesh
实例方法的方法引用
与静态方法类似,我们可以使用方法引用引用对象的实例方法。
语法
<<object-name>>::methodName
示例:实例方法的引用
在此示例中,我们引用了 Integer 类的实例方法来比较元素,方法有两种。第一种方法是使用带有具有显式方法调用的 lambda 表达式的 sorted 方法来常规比较元素。第二种方法是使用方法引用。
package com.tutorialspoint; import java.util.Arrays; import java.util.List; public class Tester { public static void main(String args[]) { List<Integer> numbers = Arrays.asList(1,2,4,9,8,7,3); System.out.println("Sorted using lambda expression"); numbers = numbers.stream().sorted((a,b) -> a.compareTo(b)).toList(); System.out.println(numbers); numbers = Arrays.asList(1,2,4,9,8,7,3); System.out.println("Sorted using method reference" ); numbers = numbers.stream().sorted(Integer::compareTo).toList(); System.out.println(numbers); } }
输出
让我们编译并运行上述程序,这将产生以下结果:
Sorted using lambda expression [1, 2, 3, 4, 7, 8, 9] Sorted using method reference [1, 2, 3, 4, 7, 8, 9]
构造函数的方法引用
我们也可以使用方法引用来调用构造函数。这类似于静态方法调用,但这里我们使用 new 而不是方法名。
语法
<<class-name>>::new
示例:构造函数的引用
在此示例中,我们在迭代学生姓名列表时,根据学生的姓名创建 Student 类的新的对象。
package com.tutorialspoint; import java.util.Arrays; import java.util.List; public class Tester { public static void main(String args[]) { List<String> studentNames = Arrays.asList("Mahesh","Suresh","Ramesh","Robert","Jon"); // create the list of student objects from names Student[] students = studentNames.stream().map(Student::new).toArray(Student[]::new); List<String> list = Arrays.asList(students); System.out.println(list); } } class Student{ String name; Student(String name){ this.name = name; } public String toString(){ return this.name; } }
输出
让我们编译并运行上述程序,这将产生以下结果:
[Mahesh, Suresh, Ramesh, Robert, Jon]
广告