`

java8特征之方法引用::

    博客分类:
  • JAVA
 
阅读更多

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();
            }
        }
    
    }
    
     
分享到:
评论

相关推荐

    Java+8实战_Java8_java8_

    1. **lambda表达式**:这是Java 8最显著的特征之一,它允许函数作为一等公民,即可以赋值给变量、作为参数传递和作为返回值。Lambda表达式使得编写简洁、易读的代码成为可能,特别是对于处理集合的操作。 2. **函数...

    java8中文api

    这个"java8中文api"是一个中文版的Java 8 API文档,对于中国开发者来说,是一个非常有用的参考资料。API(Application Programming Interface)是软件开发中的一个重要概念,它定义了不同组件之间交互的方式。在Java...

    java8 demo源代码

    4. **方法引用**:方法引用来代替lambda表达式,当函数体与已存在的方法相同时,可以更直观地引用该方法。例如,`Arrays.sort(list, List::compareTo)`使用了`List`接口的`compareTo`方法。 5. **日期和时间API**:...

    最新Java JDK 8免安装版(Linux 64位)

    1. **Lambda表达式**:Java 8引入了函数式编程的概念,Lambda表达式是最显著的特征之一。它允许开发者以简洁的方式处理集合,简化多线程编程,并在需要时定义匿名函数。 2. **方法引用和构造器引用**:与Lambda...

    Java8-JDK8-新特性学习

    1. **lambda表达式**:这是Java 8最显著的特征之一。Lambda表达式允许开发者以简洁的方式定义匿名函数,使得函数式编程在Java中变得更加便捷。例如,可以使用`()-&gt;System.out.println("Hello, World!")`来创建一个...

    OnJava8-Examples-master

    4. **方法引用**:方法引用是另一个Java 8的特性,允许直接引用已有方法,而不是通过lambda表达式重写。这对于已经存在合适实现的函数接口,可以避免重复代码。 5. **日期和时间API**:Java 8彻底改革了日期和时间...

    java8stream源码-java-8-practice:Java8新特性实践

    java8流源码Java 8 新特性实践 Java 8 于 2014 年 3 月 18 日发布。它是 Java 软件开发平台的革命性版本。 它包括对 Java 编程、JVM、工具和库的各种升级。 Java 8 是 Java 历史上功能最丰富的版本之一。 Java 8 ...

    Java8的6个问题Java开发Java经验技巧共5页.p

    Lambda表达式是Java8最显著的特征之一,它允许我们以简洁的方式编写匿名函数。Lambda可以作为方法参数,或者存储在变量中。例如,我们可以用lambda来实现Comparator接口,进行列表排序: ```java List&lt;String&gt; list...

    Java8应用封装,手写ORM,LOG,framework

    - **Lambda表达式**:这是Java8最显著的特性之一,允许我们以简洁的方式定义匿名函数,大大简化了对集合的操作和事件处理。 - **Stream API**:提供了对集合进行一系列操作的链式方法,如过滤、映射、减少等,使得...

    JAVA8新特性总结及案例.doc

    JAVA8 中引入的 Lambda 表达式、方法引用和函数式接口是三个重要的新特性,它们之间有紧密的联系,都是为了简洁代码、提高编程效率和灵活性。 一、Lambda 表达式 Lambda 表达式,也称为闭包,是 JAVA8 中最重要的...

    java笔记 java笔记

    - **类(Class)**:定义了一组属性和方法,用于描述一类事物的特征和行为。 - **对象(Object)**:类的实例,每个对象都具有特定的状态和行为。 - **方法(Method)**:函数在Java中的另一种说法,用来执行特定任务的一...

    Java核心技术 卷I 基础知识(原书第8版)

    方法是Java中实现功能模块化的重要手段,一个方法包含一系列执行特定任务的指令集合。 - **定义方法**:包括返回类型、方法名、参数列表等。 - **调用方法**:通过方法名加上括号来调用已定义的方法。 ### Java类和...

    帮助文档之 java

    8. **异常处理**:Java的异常处理机制通过try-catch-finally语句块来捕获和处理程序运行时可能出现的错误。 9. **反射(Reflection)**:Java反射机制允许程序在运行时检查类的信息,如类名、方法、字段等,并动态...

    java8视频高清.7z

    这个名为"java8视频高清.7z"的压缩包显然包含了关于Java 8的高清教学视频,旨在帮助新手快速掌握这个版本的新特性。以下是对这些关键知识点的详细解释: 1. **Lambda表达式**:Lambda表达式是Java 8最显著的特征之...

    最新Java面试题

    - **接口和抽象类的异同之处**:接口只包含抽象方法,而抽象类可以包含抽象方法和具体方法;接口支持多重继承,抽象类只能被单一继承。 - **Java的垃圾回收机制**:自动管理内存,通过跟踪对象的引用关系确定不再...

    Java思维导图

    5. **Java基础语法**:Java的基础语法包括变量声明、数据类型(基本类型和引用类型)、运算符、控制结构(条件语句、循环语句)、方法定义和调用。 6. **Java基本概念**:理解类、对象、封装、继承和多态是Java的...

    JAVA面试 面经 JAVA面试 面经

    * 引用类型:java.lang.String, Integer, Boolean等 3. String和StringBuffer的区别 * String:不可改变的字符串,提供了数值不可改变的字符串 * StringBuffer:可以修改的字符串,提供了字符串的修改功能 4. ...

    chapter3 Java语言的面向对象特征2.ppt

    基于提供的文件信息,我将生成相关的知识点,详细解释...本节课我们学习了 Java 语言的面向对象特征,包括对象的定义、赋值、成员表示、作为引用类型的变量、使用、构造方法、初始化、访问权限、复制和应用等知识点。

    2024java面试题.pdf

    1. **Java 中 sleep 方法和 wait 方法的区别:** - **sleep**:是 Thread 类的方法,使当前线程暂停执行指定时间,不会释放锁。 - **wait**:是 Object 类的方法,使当前线程等待,直到其他线程调用此对象的 ...

Global site tag (gtag.js) - Google Analytics