003 方法引用

一.方法的分析

  首先我们看下面的一个例子:

public class MethodRefrence {

    static class Inner {
        public void exec(Inner this) {
            System.out.println("exec.....");
        }

        public static void staticExec() {
            System.out.println("static ... exec");
        }
    }

    @Test
    public void test1() {
        Inner inner = new Inner();
        inner.exec();
    }
}

在上面的代码之中,最为奇怪的就是我们的一个实例方法之中的第一个参数是this.

其实这个this就是实例方法和静态方法最大区别了,一个实例方法之中,在编译的时候,会自动传入一个this的参数,参数的类型就是本类的类型.

再了解了上述的事实之后,我们来看一下方法的引用.



二 方法引用

  如果我们抽象了一个方法之后,我们发现这个方法本身就是一个lambda表达式.

  因为它的基本结构就是参数列表和返回值,其中的方法体对应了lambda之中的代码体.

我们知道一个方法在java之中答题可以分成下面的三种:

[1]静态方法

[2]实例方法

[3]构造方法

在下面我们来分别看上述的三种方法的方法引用的使用.



三. 静态方法的引用 

public class StaticClass {

    public static void exec() {
        System.out.println("static method ....");
    }

    public static void main(String[] args) {
        Runnable run = StaticClass::exec;
        run.run();
    }

}

在上面的代码之中,我们最关注的就是 ‘::‘ 这个符号,这个符号出现在java8之中,代表的就是一个方法引用,其实方法引用也是一个lambda.

还记得之前我们写过类似的代码吗?

从这里我们看到,一个函数之中,我们最为关注的就是参数列表和返回值,方法体就是逻辑单元.

  这样的结构就是lambda的基本形式.

在这里我们展示的就是静态方法引用,基本的结构就是------>  类名 :: 静态方法名.



四 .实例方法

  首先我们看下面的例子 :

public class StaticClass {
    public void instanceMethod() {
        System.out.println("instance method ....");
    }

    public static void main(String[] args) {

        StaticClass instance = new StaticClass();
        Runnable run = instance::instanceMethod;
    }

}

我们看到实例方法和静态方法引用的区别仅仅就是我们使用实例对象进行方法引用了.



五 . 构造方法引用

  我们知道构造函数其实和普通的函数的区别仅仅在于构造函数的返回值.

  构造方法没有返回值,但是实际上在使用new 关键词的时候回返回一个对象.

首先我们看下面的一个例子:  

Supplier<StaticClass> supplier = StaticClass::new;
        supplier.get().instanceMethod();

上面展示的是一个无参构造函数的情况,现在我们展示一下有参构造函数的情况.

Function<String, StaticClass> func = StaticClass :: new;
func.apply("trek").instanceMethod();

在这里我们看到我们我们使用相同的语法,却创建了不同的对象,这完全依赖于 java8之中的参数推导的功能.

  

原文地址:https://www.cnblogs.com/trekxu/p/9397618.html

时间: 2024-11-06 03:30:21

003 方法引用的相关文章

JAVA 8 方法引用 - Method References

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

Java8之方法引用

一.概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法.然而,有时候我们仅仅是调用了一个已存在的方法.如下: Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2)); 在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法. Arrays.sort(stringsArray, String::compareToIgnoreCase); 这种特性就叫做方法引用(Method

JDK8的lambda表达式、方法引用

(部分转自:https://www.cnblogs.com/xiaoxi/p/7099667.html) 1. lambda表达式 以前定义一个Thread: 1 final int i = 0; 2 new Thread(new Runnable() { 3 @Override 4 public void run() { 5 System.out.println("i = " + i); 6 } 7 }).start(); lambda表达式定义: 1 int i = 0; 2 ne

java8之lambda表达式(方法引用)

有些时候,你想要传递给其他代码的操作已经有实现的方法了.示例: button.setOnAction(event -> System.out.println(event); 如果你能够只将println方法传递给setOnAction方法,就更好了!下面是改后的代码: button.setOnAction(System.out::println); 表达式System.out::println是一个方法引用,等同于lambda表达式: x -> System.out.println(x) 正如

Java8学习笔记(二)-函数式接口与方法引用

一.Lambada表达式到底是什么 首先先看一下下面的一段代码! package cn.org.kingdom.jdk8; @FunctionalInterface interface MyInterface { void test(); String toString(); } public class Test { public void test(MyInterface inter) { System.out.println("*************************"

java基础-四种方法引用

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

Java8 方法引用与构造器引用

package java_8; import org.junit.Test; import java.io.PrintStream; import java.util.Comparator; import java.util.function.*; import java.util.function.Function; /** * 方法引用:若Lambda体中的内容有方法已经实现了,那么我们可以使用"方法引用" * (可以理解为方法引用时Lambda表达式的另外一种表现形式 * * 主

Swift编程语言中的方法引用(基于2.2版本)

由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与Objective-C不同,由于Objective-C的方法都属于“消息”,因此直接用selector的消息签名即可表示一条确定的消息作为方法引用.而Swift的方法更类似于C++.Java中的方法,也就是说比Objective-C更静态,因此它不具有如此般灵活性. 另外,在Swift编程语言中,方法引用与C

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[]){ /