Java 8 方法引用

There are four kinds of method references:

Kind Example
Reference to a static method ContainingClass::staticMethodName
Reference to an instance method of a particular object containingObject::instanceMethodName
Reference to an instance method of an arbitrary object of a particular type ContainingType::methodName
Reference to a constructor ClassName::new

方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
方法引用使用一对冒号 :: 。
下面,我们定义了 4 个方法作为例子来区分 Java 中 4 种不同方法的引用。

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;

public class ComparisonProvider {

    public int compareByName(Person a, Person b) {
        return a.getName().compareTo(b.getName());
    }

    public static int compareByAge(Person a, Person b) {
        return a.getBirthday().compareTo(b.getBirthday());
    }

    public static void main(String[] args) {
        List<Person> roster = Person.createRoster();
        Person[] rosterAsArray = roster.toArray(new Person[roster.size()]);

        // 特定对象的实例方法引用: containingObject::instanceMethodName
        ComparisonProvider myComparisonProvider = new ComparisonProvider();
        System.out.println("排序前:" + Arrays.toString(rosterAsArray));
        Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);
        System.out.println("排序后:" + Arrays.toString(rosterAsArray));

        // 静态方法引用:ContainingClass::staticMethodName
        System.out.println("排序前:" + Arrays.toString(rosterAsArray));
        Arrays.sort(rosterAsArray, ComparisonProvider::compareByAge);
        System.out.println("排序后:" + Arrays.toString(rosterAsArray));

        // 特定类型的任意对象的实例方法的引用: ContainingType::methodName
        String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
        System.out.println("排序前:" + Arrays.toString(stringArray));
        Arrays.sort(stringArray, String::compareToIgnoreCase);
        System.out.println("排序后:" + Arrays.toString(stringArray));

        // 构造器引用: ClassName::new
        Person newPerson = Person.create(Person::new);
        newPerson.setName("xiaocao");
        newPerson.setBirthday(LocalDate.of(1995, 8, 20));
        System.out.println(newPerson);
    }
}

点击查看结果

排序前:[[Fred, 1980-06-20], [Jane, 1990-07-15], [George, 1991-08-13], [Bob, 2000-09-12]]
排序后:[[Bob, 2000-09-12], [Fred, 1980-06-20], [George, 1991-08-13], [Jane, 1990-07-15]]
排序前:[[Bob, 2000-09-12], [Fred, 1980-06-20], [George, 1991-08-13], [Jane, 1990-07-15]]
排序后:[[Fred, 1980-06-20], [Jane, 1990-07-15], [George, 1991-08-13], [Bob, 2000-09-12]]
排序前:[Barbara, James, Mary, John, Patricia, Robert, Michael, Linda]
排序后:[Barbara, James, John, Linda, Mary, Michael, Patricia, Robert]
[xiaocao, 1995-08-20]

参考链接:

原文地址:https://www.cnblogs.com/hglibin/p/10053265.html

时间: 2024-10-14 11:24:28

Java 8 方法引用的相关文章

java 8 方法引用(method references)

1 什么是方法引用(method references) java 8 添加了一个很熟悉但是又很陌生的符号::. 你也许会看到这样的代码 System.out::println 其实就是方法引用(method references).由于java 8 把方法/函数也作为第一输入参数.所以你会看到inventory.comparing(Apple::getWeight);这样"奇怪"的代码. 2 如何使用方法引用(method references) 其实方法引用是lambda 表达式的

JAVA 8 方法引用 - Method References

什么是方法引用 简单地说,就是一个Lambda表达式.在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰,Java 8的方法引用允许我们这样做.方法引用是一个更加紧凑,易读的Lambda表达式,注意方法引用是一个Lambda表达式,其中方法引用的操作符是双冒号"::". 方法引用例子 先看一个例子 首先定义一个Person类,如下:

Java 之 方法引用

方法引用 一.冗余的Lambda场景 来看一个简单的函数式接口以应用Lambda表达式: 1 @FunctionalInterface 2 public interface Printable { 3 void print(String str); 4 } 在 Printable 接口当中唯一的抽象方法 print 接收一个字符串参数,目的就是为了打印显示它.那么通过Lambda来使用它的代码很简单: 1 public class Demo01PrintSimple { 2 private st

jdk1.8新特性Lambda表达式方法引用

前言 在之前我们接触了JDK1.8引入的新特新lambda表达式没在某种程度上,它可以简化我们的代码,帮助我们快速的编写代码,但在这其中我们之前的编写方式并不是lambda表达式最简洁的方式,而在头屑情况下我们可以使用lambda表达式的方法引用是代码进一步简洁化. 一.方法引用: 在java中方法引用主要是用来替代lambda表达式进一步简化代码,方法引用符号的写法是两个冒号“::”,其中方法引用的用法有一下几种. 1.对象名称::成员方法 如果一个对象中有一个成员方法,就好就是lambda表

java基础-四种方法引用

实例 直接三角形,通过两边算第三边,目的是为了如何使用这几种方法引用.代码中多有些不合适,尽情原谅. 静态方法引用 接口的参数列表与类中的具体实现方法的参数列表一样,返回值一致. 调用 //静态引用 IStaticSide staticSide = Five::getStaticSize; staticSide.getStaticSize(3, 6); 类中定义 //静态引用 public static double getStaticSize(double s,double s2) { ret

java中的方法引用

引用静态方法:类名称::static 方法名称: 引用某个对象的方法:对象::普通方法: 引用特定类方法:特定类::方法 引用构造方法:类名称::new 范例:引用静态方法 package com.java.demo; interface IMessage<P,R>{ // P表示方法的参数类型,R表示方法的返回值类型 public R change(P p); } public class TestDemo{ public static void main(String args[]){ /

Upgrading to Java 8——第二章 Method References(方法引用)

概述 很多java 方法 会使用函数式接口作为参数.例如,java.util.Arrays类中的一个sort方法,就接受一个Comparator接口,它就是一个函数式接口,sort方法的签名如下: public static T[] sort(T[] array, Comparator<? super T> comparator) 相对于传递一个Compartor的实例给sort方法,不如传递一个Lambda表达式. 进一步,我们可以传递一个方法引用来代替Lambda表达式,一个简单的方法引用

Java 8 新特性:Lambda 表达式之方法引用(Lambda 表达式补充版)——诺诺&quot;涂鸦&quot;记忆

----------   诺诺学习技术交流博客.期待与您交流!    ---------- 详情请查看:http://blog.csdn.net/sun_promise  方法引用 (注:此文乃个人查找资料然后学习总结的,若有不对的地方,请大家指出,非常感谢!) 1.方法引用简述 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法.方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文.计算时,方法引用会创建函数式接口的一个实例. 当Lambda表达式中

Java 8新特性-4 方法引用

对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMethodName 引用对象方法:  Object:: methodName 引用特定类型方法: ClassName :: methodName 引用构造方法: ClassName  :: new 静态方法引用示例 /** * 静态方法引用 * @param <P> 引用方法的参数类型 * @param