java8新特性之方法引用示例代码

简介

方法引用是java8的新特性之一, 可以直接引用已有Java类或对象的方法或构造器。方法引用与lambda表达式结合使用,可以进一步简化代码。

方法引用的使用场景

我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下,我们倾向于通过方法名来调用它,而Lambda表达式可以帮助我们实现这一要求,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。方法引用可以理解为Lambda表达式的另外一种表现形式。

方法引用的分类

类型 语法 对应的Lambda表达式
静态方法引用 类名::staticMethod (args) -> 类名.staticMethod(args)
实例方法引用 inst::instMethod (args) -> inst.instMethod(args)
对象方法引用 类名::instMethod (inst,args) -> 类名.instMethod(args)
构建方法引用 类名::new (args) -> new 类名(args)

示例代码:

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * create gl
 **/
@Data
@AllArgsConstructor
public class User {
 private String name;
 private Integer age;
 private String sex;
 private Status status;

 public User(String name){
  this.name=name;
 }
 public User(){}

 public User(String name, Integer age, String sex) {
  this.name = name;
  this.age = age;
  this.sex = sex;
 }

 public enum Status{
  FREE,
  BUSY,
  VOCATION;
 }

}

import com.gl.java8test.User;

import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * create gl
 *
 * 一。方法引用:若lambda 体中的内容 有方法已经实现,我们可以使用”方法引用“
 *
 * 主要有三种语法格式
 *
 * 1. 对象 :: 实例方法名
 * 2. 类 :: 静态方法名
 * 3. 类 :: 实例方法名
 *
 * 注意:方法体中的参数与返回类型 必须与该函数接口中的参数返回类型保持一致
 *   第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写 ClassName::method
 *
 *
 * 二。 构造器引用
 *  格式: ClassName::new
 *
 * 三. 数组引用
 *  格式: Type[]::new
 **/
public class Test03 {

 //对象 :: 实例方法名
 public static void test1(){
  Consumer<String> consumer = System.out::println;
  consumer.accept("631235");
  System.out.println("----------------------------");
  User user=new User();
  Supplier<String> stringSupplier = user::getName;
  stringSupplier.get();
 }

 //类 :: 静态方法名
 public static void test2(){
  Comparator<Integer> comparator = Integer::compare;
 }

 //类 :: 实例方法名
 public static void test3(){
  BiPredicate biP = (x,y) -> x.equals(y);
  // 下面这样写必须是 : 第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写 ClassName::method
  BiPredicate<String,String> biPredicate=String::equals;
 }

 //构造器引用 构造器的参数与返回类型 必须与该函数接口中的参数返回类型保持一致
 public static void test4(){
//  Supplier<User> userSupplier = () -> new User();
  Supplier<User> userSupplier=User::new;
  User user = userSupplier.get();

  System.out.println("----------------------------");
  Function<String,User> function = User::new;
  User user1 = function.apply("sfsdf");
  System.out.println(user1);
 }

 //数组引用
 public static void test5(){
//  Function<Integer,String[]> function = x -> new String[x];
  Function<Integer,String[]> function = String[]::new;
 }

 public static void main(String[] args) {
//  test1();
  test4();
 }
}
import com.gl.java8test.User;

import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * create gl
 *
 * 一。方法引用:若lambda 体中的内容 有方法已经实现,我们可以使用”方法引用“
 *
 * 主要有三种语法格式
 *
 * 1. 对象 :: 实例方法名
 * 2. 类 :: 静态方法名
 * 3. 类 :: 实例方法名
 *
 * 注意:方法体中的参数与返回类型 必须与该函数接口中的参数返回类型保持一致
 *   第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写 ClassName::method
 *
 *
 * 二。 构造器引用
 *  格式: ClassName::new
 *
 * 三. 数组引用
 *  格式: Type[]::new
 **/
public class Test03 {

 //对象 :: 实例方法名
 public static void test1(){
  Consumer<String> consumer = System.out::println;
  consumer.accept("631235");
  System.out.println("----------------------------");
  User user=new User();
  Supplier<String> stringSupplier = user::getName;
  stringSupplier.get();
 }

 //类 :: 静态方法名
 public static void test2(){
  Comparator<Integer> comparator = Integer::compare;
 }

 //类 :: 实例方法名
 public static void test3(){
  BiPredicate biP = (x,y) -> x.equals(y);
  // 下面这样写必须是 : 第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写 ClassName::method
  BiPredicate<String,String> biPredicate=String::equals;
 }

 //构造器引用 构造器的参数与返回类型 必须与该函数接口中的参数返回类型保持一致
 public static void test4(){
//  Supplier<User> userSupplier = () -> new User();
  Supplier<User> userSupplier=User::new;
  User user = userSupplier.get();

  System.out.println("----------------------------");
  Function<String,User> function = User::new;
  User user1 = function.apply("sfsdf");
  System.out.println(user1);
 }

 //数组引用
 public static void test5(){
//  Function<Integer,String[]> function = x -> new String[x];
  Function<Integer,String[]> function = String[]::new;
 }

 public static void main(String[] args) {
//  test1();
  test4();
 }
}

总结

到此这篇关于java8新特性之方法引用的文章就介绍到这了,更多相关java8新特性方法引用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入理解Java中的构造函数引用和方法引用

    JDK 8 见证了一个特殊特性的出现:构造函数引用和方法引用.在本文中, Adrian D. Finlay 探讨了开发人员如何释放构造函数引用的真正潜力. 方法引用的一些背景 如果你还不知道 Java 构造函数本身就是特殊的方法,那么阅读方法引用的基本示例将对读者有所帮助,通过了解这些内容,可以了解构造函数引用是什么. 「方法引用为已经有名称的方法提供易读的 lambda 表达式.」 「它们提供了一种无需执行就可以引用方法的简单方式.」 以上引自<Java 8 编程参考官方教程(第 9 版)>

  • Java8方法引用和构造引用代码实例

    这篇文章主要介绍了java8方法引用和构造引用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一方法引用概述 方法引用是特定Lamda表达式的一种简写,其思路就是能替换Lamda表达式就直接调用函数使用方法名. 其语法格式:类名 :: 方法名. 二3种方法引用 1 指向静态方法的引用 语法格式: 静态类名(ClassName)::方法名(MethodName) 示例: // 1 Lamda静态方法 @Test public void L

  • Java 8新特性方法引用详细介绍

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

  • Java8方法引用及构造方法引用原理实例解析

    如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言Java也可以写出优雅的函数式调用,学习的过程并不复杂,当你学会了Java8中函数式编程的新特性,你一定会对他爱不释手的.下面介绍一下基于Lambda表达式简写的两种引用.避免再次看到这种代码时的尴尬

  • Java函数式编程(八):字符串及方法引用

    第三章 字符串,比较器和过滤器 JDK引入的一些方法对写出函数式风格的代码很有帮助.JDK库里的一些的类和接口我们已经用得非常熟悉了,比如说String,为了摆脱以前习惯的那种老的风格,我们得主动寻找机会来使用这些新的方法.同样,当我们需要用到只有一个方法的匿名内部类时,我们现在可以用lambda表达式来替换它了,不用再像原来那样写的那么繁琐了. 本章我们会使用lambda表达式和方法引用来遍历字符串,实现Comparator接口,查看目录中的文件,监视文件及目录的变更.上一章中介绍的一些方法还

  • Java8中如何通过方法引用获取属性名详解

    前言 在我们开发过程中常常有一个需求,就是要知道实体类中Getter方法对应的属性名称(Field Name),例如实体类属性到数据库字段的映射,我们常常是硬编码指定 属性名,这种硬编码有两个缺点. 1.编码效率低:因为要硬编码写属性名,很可能写错,需要非常小心,时间浪费在了不必要的检查上. 2.容易让开发人员踩坑:例如有一天发现实体类中Field Name定义的不够明确,希望换一个Field Name,那么代码所有硬编码的Field Name都要跟着变更,对于未并更的地方,是无法在编译期发现的

  • Java8 Lamda方法引用和构造引用原理

    一方法引用概述 方法引用是特定Lamda表达式的一种简写,其思路就是能替换Lamda表达式就直接调用函数使用方法名. 其语法格式:类名 :: 方法名. 二3种方法引用 1 指向静态方法的引用 语法格式: 静态类名(ClassName)::方法名(MethodName) 示例: // 1 Lamda静态方法 @Test public void LamdaSTest(){ String youku1327 = "1327"; Function function = s -> Obje

  • 如何更好的使用Java8中方法引用详解

    前言 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法.方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文.计算时,方法引用会创建函数式接口的一个实例. 当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些.方法引用是一种更简洁易懂的Lambda表达式. 注意:方法引用是一个Lambda表达式,其中方法引用的操作符是双冒号"::". 在Java8中,使用方法引用非常简单,如String

  • 30分钟入门Java8之方法引用学习

    前言 之前两篇文章分别介绍了Java8的lambda表达式和默认方法和静态接口方法.今天我们继续学习Java8的新语言特性--方法引用(Method References). 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法.然而,有时候我们仅仅是调用了一个已存在的方法.如下: Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2)); 在Java8中,我们可以直接通过方法引用来简写lambda表达式中已

  • 使用java8的方法引用替换硬编码的示例代码

    背景 想必大家在项目中都有遇到把一个列表的多个字段累加求和的情况,也就是一个列表的总计.有的童鞋问,这个不是给前端做的吗?后端不是只需要把列表返回就行了嘛...没错,我也是这样想的,但是在一场和前端的撕逼大战中败下阵来之后,这个东西就落在我身上了.当时由于工期原因,时间比较紧,也就不考虑效率和易用性了,只是满足当时的需求,就随便写了个方法统计求和.目前稍微闲下来了,就把原来的代码优化下.我们先来看一下原来的代码... 原代码 工具类 import org.apache.commons.lang3

随机推荐