Java 8中方法也是一种对象,可以By名字来引用。不过方法引用的唯一用途是支持Lambda的简写,使用方法名称来表示Lambda。不能通过方法引用来获得诸如方法签名的相关信息。
方法引用的分类
方法引用分为4类,常用的是前两种。方法引用也受到访问控制权限的限制,可以通过在引用位置是否能够调用被引用方法来判断。具体分类信息如下:
-
引用静态方法
ContainingClass::staticMethodName
例子: String::valueOf,对应的Lambda:(s) -> String.valueOf(s)
比较容易理解,和静态方法调用相比,只是把.换为:: -
引用特定对象的实例方法
containingObject::instanceMethodName
例子: x::toString,对应的Lambda:() -> this.toString()
与引用静态方法相比,都换为实例的而已 -
引用特定类型的任意对象的实例方法
ContainingType::methodName
例子: String::toString,对应的Lambda:(s) -> s.toString()
太难以理解了。难以理解的东西,也难以维护。建议还是不要用该种方法引用。
实例方法要通过对象来调用,方法引用对应Lambda,Lambda的第一个参数会成为调用实例方法的对象。 -
引用构造函数
ClassName::new
例子: String::new,对应的Lambda:() -> new String()
构造函数本质上是静态方法,只是方法名字比较特殊。 -
package com.keji; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Supplier; public class Java8Test { public static void main(String args[]){ // 方法引用::引用构造函数 PersonFactory factory = new PersonFactory(Person::new); List<Person> personList = new ArrayList<Person>(); Person p1 = factory.getPerson(); p1.setName("Kobe"); personList.add(p1); Person p2 = factory.getPerson(); p2.setName("James"); personList.add(p2); Person p3 = factory.getPerson(); p3.setName("Paul"); personList.add(p3); Person[] persons1 = personList.toArray(new Person[personList.size()]); System.out.print("排序前: "); printArray(persons1); // 方法引用::引用静态方法 Arrays.sort(persons1, Java8Test::myCompare); System.out.print("排序后: "); printArray(persons1); System.out.println(); Person[] persons2 = personList.toArray(new Person[personList.size()]); System.out.print("排序前: "); printArray(persons2); // 方法引用::用特定对象的实例方法 Arrays.sort(persons2, p1::compare); System.out.print("排序后: "); printArray(persons2); System.out.println(); Person[] persons3 = personList.toArray(new Person[personList.size()]); System.out.print("排序前: "); printArray(persons3); // 方法引用::引用特定类型的任意对象的实例方法 Arrays.sort(persons3, Person::compareTo); System.out.print("排序后: "); printArray(persons3); } public static void printArray(Person[] persons) { for (Person p : persons) { System.out.print(p.name + " "); } System.out.println(); } public static int myCompare(Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); } static class Person { private String name; public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int compare(Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); } public int compareTo(Person p) { return this.getName().compareTo(p.getName()); } } static class PersonFactory { private Supplier<Person> supplier; public PersonFactory(Supplier<Person> supplier) { this.supplier = supplier; } public Person getPerson() { return supplier.get(); } } }
相关推荐
1. **lambda表达式**:这是Java 8最显著的特征之一,它允许函数作为一等公民,即可以赋值给变量、作为参数传递和作为返回值。Lambda表达式使得编写简洁、易读的代码成为可能,特别是对于处理集合的操作。 2. **函数...
这个"java8中文api"是一个中文版的Java 8 API文档,对于中国开发者来说,是一个非常有用的参考资料。API(Application Programming Interface)是软件开发中的一个重要概念,它定义了不同组件之间交互的方式。在Java...
4. **方法引用**:方法引用来代替lambda表达式,当函数体与已存在的方法相同时,可以更直观地引用该方法。例如,`Arrays.sort(list, List::compareTo)`使用了`List`接口的`compareTo`方法。 5. **日期和时间API**:...
1. **Lambda表达式**:Java 8引入了函数式编程的概念,Lambda表达式是最显著的特征之一。它允许开发者以简洁的方式处理集合,简化多线程编程,并在需要时定义匿名函数。 2. **方法引用和构造器引用**:与Lambda...
4. **方法引用**:方法引用是另一个Java 8的特性,允许直接引用已有方法,而不是通过lambda表达式重写。这对于已经存在合适实现的函数接口,可以避免重复代码。 5. **日期和时间API**:Java 8彻底改革了日期和时间...
1. **lambda表达式**:这是Java 8最显著的特征之一。Lambda表达式允许开发者以简洁的方式定义匿名函数,使得函数式编程在Java中变得更加便捷。例如,可以使用`()->System.out.println("Hello, World!")`来创建一个...
java8流源码Java 8 新特性实践 Java 8 于 2014 年 3 月 18 日发布。它是 Java 软件开发平台的革命性版本。 它包括对 Java 编程、JVM、工具和库的各种升级。 Java 8 是 Java 历史上功能最丰富的版本之一。 Java 8 ...
Lambda表达式是Java8最显著的特征之一,它允许我们以简洁的方式编写匿名函数。Lambda可以作为方法参数,或者存储在变量中。例如,我们可以用lambda来实现Comparator接口,进行列表排序: ```java List<String> list...
- **Lambda表达式**:这是Java8最显著的特性之一,允许我们以简洁的方式定义匿名函数,大大简化了对集合的操作和事件处理。 - **Stream API**:提供了对集合进行一系列操作的链式方法,如过滤、映射、减少等,使得...
8. **Java的应用版本**: - Java SE(标准版)用于桌面应用程序和服务器端开发。 - Java ME(微型版)适用于嵌入式设备和移动设备开发。 - Java EE(企业版)针对企业级应用,包含Web服务、数据库连接等功能。 9...
JAVA8 中引入的 Lambda 表达式、方法引用和函数式接口是三个重要的新特性,它们之间有紧密的联系,都是为了简洁代码、提高编程效率和灵活性。 一、Lambda 表达式 Lambda 表达式,也称为闭包,是 JAVA8 中最重要的...
- **类(Class)**:定义了一组属性和方法,用于描述一类事物的特征和行为。 - **对象(Object)**:类的实例,每个对象都具有特定的状态和行为。 - **方法(Method)**:函数在Java中的另一种说法,用来执行特定任务的一...
方法是Java中实现功能模块化的重要手段,一个方法包含一系列执行特定任务的指令集合。 - **定义方法**:包括返回类型、方法名、参数列表等。 - **调用方法**:通过方法名加上括号来调用已定义的方法。 ### Java类和...
8. **异常处理**:Java的异常处理机制通过try-catch-finally语句块来捕获和处理程序运行时可能出现的错误。 9. **反射(Reflection)**:Java反射机制允许程序在运行时检查类的信息,如类名、方法、字段等,并动态...
这个名为"java8视频高清.7z"的压缩包显然包含了关于Java 8的高清教学视频,旨在帮助新手快速掌握这个版本的新特性。以下是对这些关键知识点的详细解释: 1. **Lambda表达式**:Lambda表达式是Java 8最显著的特征之...
Java程序员面试宝典的知识点主要包括Java基础、面向对象的特征、异常处理、多线程编程等方面。 1. Java基础部分:包括了Java基本语法、数据类型、运算符、流程控制等基础知识点。如一个Java源文件是否可以包含多个...
- **接口和抽象类的异同之处**:接口只包含抽象方法,而抽象类可以包含抽象方法和具体方法;接口支持多重继承,抽象类只能被单一继承。 - **Java的垃圾回收机制**:自动管理内存,通过跟踪对象的引用关系确定不再...
5. **Java基础语法**:Java的基础语法包括变量声明、数据类型(基本类型和引用类型)、运算符、控制结构(条件语句、循环语句)、方法定义和调用。 6. **Java基本概念**:理解类、对象、封装、继承和多态是Java的...
* 引用类型:java.lang.String, Integer, Boolean等 3. String和StringBuffer的区别 * String:不可改变的字符串,提供了数值不可改变的字符串 * StringBuffer:可以修改的字符串,提供了字符串的修改功能 4. ...
1. **Java 中 sleep 方法和 wait 方法的区别:** - **sleep**:是 Thread 类的方法,使当前线程暂停执行指定时间,不会释放锁。 - **wait**:是 Object 类的方法,使当前线程等待,直到其他线程调用此对象的 ...