方法引用的使用

  最初,引用只是针对引用类型完成的,也就是只有数组、类、接口才具备引用操作。JDK1.8后追加了方法引用。实际上引用的本质就是别名。

  因此方法的引用就是别名的使用。

  方法的引用有四种形式:

  引用静态方法: 类名称:static方法名称;

  引用某个对象的方法:实例化对象:普通方法;

  引用某个特定类的方法:类名称:普通方法;

  引用构造方法:类名称:new。

  方法的引用是结合函数式编程使用。

  1.引用静态方法

  举例:使用函数编程返回静态方法

  //函数接口+泛型接口 = 函数泛型接口

  @FunctionalInterface

  public interface IUtil{

  R swithPara(P p);

  }

  public class TestMothod {

  public static void main(String[] args) {

  IUtil iUtil = (p)->{

  //String.valueOf()为静态方法,将int->String

  return String.valueOf(p);

  };

  iUtil.swithPara(5); //5

  }

  }

  举例:使用静态方法引用

  //函数接口+泛型接口 = 函数泛型接口

  @FunctionalInterface

  public interface IUtil{

  R swithPara(P p);

  }

  public class TestMothod {

  public static void main(String[] args) {

  String str = "1234";

  //使用类的静态方法,将int->Sring

  IUtil iUtil = String::valueOf;

  System.out.println(iUtil.swithPara(5)); //5

  //将String->int

  IUtil iUtil1 = Integer::parseInt;

  System.out.println(iUtil1.swithPara(str)); //1234

  }

  }

  在上述例子中,可以两个方法看做数学函数去理解,即y = f(x)。其中:

  y = switchPara(x) ,其中x = p , 是把int->String;

  y = valueOf(x), 其中x = p , 把int-> String;

  这两者做的事情是一样的,那么给String的静态方法取个别名,就是静态方法引用。

  2. 引用对象方法

  举例:对象方法的引用

  @FunctionalInterface

  public interface IUtil

  {

  P convert();

  }

  public class TestMothod {

  public static void main(String[] args) {

  String str = "hello";

  /*

  IUtil iUtil = ()->{

  return str.toUpperCase();

  };*/

  //对象的方法引用

  IUtil iUtil = str::toUpperCase;

  System.out.println(iUtil.convert()); //HELLO

  }

  }

  3.引用类中的普通方法

  举例:引用普通方法

  @FunctionalInterface

  public interface IUtil{

  R compare(P1 p1, P2 p2);

  }

  public class TestMothod {

  public static void main(String[] args) {

  /*

  IUtil iUtil = (p1,p2)->{

  return p1.compareTo(p2);

  };*/

  //成员方法引用--- 类名::成员方法

  IUtil iUtil = Integer::compareTo;

  System.out.println(iUtil.compare(4,1));

  IUtil iUtil1 = String::compareTo;

  System.out.println(iUtil1.compare("A","a")); //-32

  } 无锡人流医院 http://xmobile.wxbhnk120.com/

  }

  4. 引用构造方法

  举例:引用构造方法

  public interface IUtil{

  R createObject(P1 p1, P2 p2);

  }

  public class Person {

  private String name;

  private Integer age;

  public Person(String name, Integer age) {

  this.name = name;

  this.age = age;

  }

  @Override

  public String toString() {

  return "Person{" +

  "name='" + name + '\'' +

  ", age=" + age +

  '}';

  }

  public class TestMothod {

  public static void main(String[] args) {

  /*

  IUtil iUtil= (p1,p2)->{

  return new Person(p1,p2);

  };*/

  //引用构造方法--- 类名称::new

  //函数接口中的参数要和构造方法中的参数匹配

  IUtil iUtil = Person::new;

  System.out.println(iUtil.createObject("张三",20));

  }

  }

  总结:

  1. 结合函数式编程使用,接口中值允许有一个方法;

  2.无论是静态引用,还是普通成员方法引用,上面几种方式中接口的返回值和要引用的返回值相同。

Java新功能之方法引用的更多相关文章

  1. 乐字节-Java8新特性之方法引用

    上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...

  2. Java 8新特性-4 方法引用

    对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMetho ...

  3. Java(43)JDK新特性之方法引用

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228461.html 博客主页:https://www.cnblogs.com/testero ...

  4. Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系

    1.Lambda表达式与接口之间的关系 只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口.见如下代码 Thread t1 = new Thread(new Runnable() ...

  5. Java 8 中的方法引用

    一.原理概要 lambda 表示式,可以作为某些匿名内部类的替代.主要目的是调用该内部类中的方法,而该方法的实现(重写)由 lambda表示式决定. 通常,我们可能不关心匿名内部类中的具体方法(被重写 ...

  6. 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)

    方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...

  7. Java 8 中的方法引用,轻松减少代码量,提升可读性!

    1. 引言 Java8中最受广大开发中喜欢的变化之一是因为引入了 lambda 表达式,因为这些表达式允许我们放弃匿名类,从而大大减少了样板代码,并提高了可读性. 方法引用是lambda表达式的一种特 ...

  8. Java8新特性之方法引用&Stream流

    Java8新特性 方法引用 前言 什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即:非运行 ...

  9. java基础-四种方法引用

    实例 直接三角形,通过两边算第三边,目的是为了如何使用这几种方法引用.代码中多有些不合适,尽情原谅. 静态方法引用 接口的参数列表与类中的具体实现方法的参数列表一样,返回值一致. 调用 //静态引用 ...

随机推荐

  1. 微信小程序上架需要增值电信业务经营许可证ICP?

    很多小程序的开发者最近都遇到了类似的问题,那就是辛辛苦苦开发出来的小程序上线不了,要求提供一些特殊资质,比方说:增值电信业务许可证(下面有数十种分类),网络文化经营许可证等类似证件,这对于创业团队来说 ...

  2. vue---数据列表循环

    使用vue进行数据循环是非常常见的操作,下面是用利用forEach和map来进行数据循环: 最常见的 forEach 循环: tbody.forEach((item,key) => { .... ...

  3. 函数vs方法

    举例 python代码示例: class A(): def method_demo(): print("我是一个方法,在类内") def function_demo(): prin ...

  4. java的字节码bytecode

    字节码名字的由来 字节码以一个字节即8bit为最小单位储存:字节码是java程序编译后的结果:字节码是一组8位字节为基础单位的二进制流 Java从源文件到执行的过程. 如何阅读JAVA字节码

  5. 解决Python查询Mysql数据库信息乱码问题

    今天尝试着用 Python 写了个脚本试着连接 mysql 数据库,并查询里边的数据,不过最终查询结果中文字符变成了ascii格式. 代码如下: #!/usr/bin/python #encoding ...

  6. SpringBoot+Mybatis+MySql 自动生成代码 自动分页

    一.配置文件 <!-- 通用mapper --> <dependency> <groupId>tk.mybatis</groupId> <arti ...

  7. filter和map内置函数

    filter filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回 ...

  8. 1、Ant和分布式介绍

    { 1.Maven 简介 2.配置Maven运行环境 3.Maven项目 4.Ant和Maven项目的简单对比 5.Maven项目之间的关系 6.War类型项目的创建(tomcat插件和资源拷贝插件) ...

  9. LeetCode 187. 重复的DNA序列(Repeated DNA Sequences)

    187. 重复的DNA序列 187. Repeated DNA Sequences 题目描述 All DNA is composed of a series of nucleotides abbrev ...

  10. jQuery的基础总结

    **本篇只列出零碎的jQuery基础知识点,个人记录自己的学习进度,无序排列,谨慎查看.** 1.jQuery入口函数的四种写法2.jQuery与JS遍历数组的区别3.jQuery符号冲突问题4.jQ ...