java8-从Lamda到方法引用和构造引用

一方法引用概述

经过前面2章Lamda原理引入和Lamda解析,基本就会熟练使用Lamda表达式,这次我们更深入点。来了解一下方法引用。
方法引用是特定Lamda表达式的一种简写,其思路就是能替换Lamda表达式就直接调用函数使用方法名。
其语法格式:类名 :: 方法名。

二3种方法引用

1 指向静态方法的引用

语法格式: 静态类名(ClassName)::方法名(MethodName)
示例:

    // 1 Lamda静态方法
    @Test
    public void LamdaSTest(){
        String youku1327 = "1327";
        Function function = s -> ObjectUtils.allNotNull(youku1327);
        System.out.println(function.apply(youku1327));// true

    }
    // 静态方法引用
    @Test
    public void MethodRefTest(){
        String youku1327 = "youku1327";
        Function function = ObjectUtils::allNotNull;
        System.out.println(function.apply(youku1327));// true
    }

2 指向对象实例的方法的引用

语法格式:实例名称(instanceName)::方法名称(MethodName)
这个对象指的是非入参的外部对象
示例:

    // 2 Lamda表达式
    @Test
    public void ObjectLamdaTest(){
        Car car = new Car("100", "black", "中国", 20);
        Supplier supplier = ()-> car.getColor();
        System.out.println(supplier.get());//black
    }
    // 对象引用
    @Test
    public void ObjectRefTest(){
        Car car = new Car("100", "black", "中国", 20);
        Supplier<String> supplier = car::getColor;
        System.out.println(supplier.get());//black
    }

3 指向实例的方法引用

语法格式:对象名称(ClassName)::方法名称(Method)
这个对象指的是入参对象

    //3 Lamda表达式
    @Test
    public void InstanceMethodLamdaTest(){
        Car car = new Car("100", "black", "中国", 20);
        Function<Car,String> function = s -> s.getColor();
        System.out.println(function.apply(car));//black
    }

    @Test
    public void InstanceMethodRefTest(){
        Car car = new Car("100", "black", "中国", 20);
        Function<Car,String> function = Car::getColor;
        System.out.println(function.apply(car));//black
    }

三构造器引用

语法格式:对象名称(ClassName)::new

    @Test
    public void constructLamdaTest(){
        BiFunction<String,Double,Car> biFunction = (s, aDouble) -> new Car(s,aDouble);
        Car car = biFunction.apply("youku1327", 50.0);
        // Car(code=youku1327, color=null, factory=null, price=50.0)
        System.out.println(car);
    }

    @Test
    public void construcMethodRefTest(){
        BiFunction<String,Double,Car> biFunction = Car::new;
        Car car = biFunction.apply("youku1327", 50.0);
        // Car(code=youku1327, color=null, factory=null, price=50.0)
        System.out.println(car);
    }

四微信公众号

觉得我写的不错的可以关注下微信公众号,更加系统的学习,下一阶段我们就进入Stream流。

原文地址:https://www.cnblogs.com/zszxz/p/12066877.html

时间: 2024-08-14 21:19:50

java8-从Lamda到方法引用和构造引用的相关文章

jdk8-lanbda方法引用和构造引用

1.方法引用概念及实例 1.对象实例方法 语法格式: 对象::实例方法名称 注意点: 实例方法必须和被实现的接口中定义的方法的参数列表和返回值一致.一般适合于一个方法就实现了的. 2.类::静态方法 注意点: 静态方法必须和被实现的接口中定义的方法的参数列表和返回值一致.一般适合于一个方法就实现了的. 3.类::实例方法名 二.构造器引用 如下图: 因为Supplier接口的get函数默认是无参数的,所以Employee::new默认调用的是无参数构造器. 即lanbmda的写法就是引用写法效果

009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用

一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法. 在Java中只有单继承,如果要让一个类赋予新的特性,通常是使用接口来实现,在C++中支持多继承,允许一个子类同时具有多个父类的接口与功能,在其他语言中,让一个类同时具有其他的可复用代码的方法叫做mixin.新的Java 8 的这个特新在编译器实现的角度上来说更

Android 使用Java8新特性之&quot;方法引用&quot;

前言 上一文:Android 使用Java8新特性之Lambda expression (附命令者模式简化) 说过lambda表达式,在android studio中的环境配置及应用.本文讲下Java8新特性之"方法引用". "方法引用",它其实可以看成lambda表达式的一种简写形式. 再回顾一下lambda表达式的应用场景:简化仅含单一抽象方法接口的调用 方法引用的4种形式 方法引用的符号形式,形如, [className | class-instance]::

java8中的方法引用与构造器引用

java8中的方法引用与构造器引用 方法引用:若Lambda体中的内容有方法已经实现了,我们可以使用"方法引用" 主要的三种语法格式: 对象::实例名 类::静态方法名 类::实例方法名 注意: Lmabda体中调用方法的参数列表与返回值类型要与函数式接口中抽象方法的函数列表和返回值类型保持一致 若Lambda参数列表中的第一参数是 实例方法的调用者,而第二个参数是 实例方法的参数时,可以使用ClassName::method public class Employee { priva

JSON的put方法是一个指针引用

JSON的put方法是一个指针引用; import org.json.simple.JSONObject; JSONObject a=new JSONObject(); a.put("date","2015-11-08");a.put("time","15:48:28"); a.toJSONString() --> {"date":"2015-11-08","time&q

java 方法参数-值调用,引用调用问题

(博客内容来自于core java卷一) 1. xx调用:程序设计语言中方法参数的传递方式: 引用调用(call by reference):表示方法接收的是调用者提供的变量地址. 值调用(call by value):表示方法接收的是调用者提供的值. 命名调用(call by name):已经成为历史. 2. Java使用值调用,而且只有值调用.也就是说方法得到的是参数值的一个拷贝,并不是参数值本身,所以,方法不能修改传递给它的的任何参数变量本身. 看下面代码: public class te

Lamda所有的Capture均是引用

[Lamda所有的Capture均是引用] 下面的程序,两个lambda 引用的实际上是同一个a.b.连int都能引用了,说明Lambda对所有类型都是以引用来处理. 1 int a = 0; 2 int b = 1; 3 Func<int> exe = ()=>{ 4 int tmp = a; 5 a = b; 6 b = tmp+b; 7 return a; 8 }; 9 Debug.Log("a1 = " + exe()); 10 Debug.Log("

Java方法中传值和引用传递的问题(转)

说明:标题其实说法是错误的.Java中只有值传递,没有引用传递. ... ... //定义了一个改变参数值的函数 public static void changeValue(int x) { x = x *2; } ... ... //调用该函数 int num = 5; System.out.println(num); changeValue(num); System.out.println(num); ... ... 调用函数changeValue()前后num的值都没有改变. 值传递的过

JDK8新特性04 方法引用与构造器引用

import java.io.PrintStream; import java.util.Comparator; import java.util.function.*; /** * 一.方法引用 * lambda方法体之 --> 方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用"方法引用" * (可以理解为方法引用是Lambda 表达式的另外一种表现形式) * * * 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实