JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~

  在Lamda新特性的支持下,JAVA8中可以使用lamda表达式来创建匿名方法。然而,有时候我们仅仅是需要调用一个已存在的方法(如java中已经定义好的方法),在这时候java8新特性“方法引用”将会进一步简化操作(注意:需要有Lamda的支持)。

方法引用的四种形式:

  • 引用静态方法-->类名称::static 方法名称;
  • 引用某个对象的实例的普通方法-->示例化对象::普通方法;
  • 引用某个类型的任意对象的实例的普通方法-->特定类::普通方法;
  • 引用构造方法-->类名称::new

引用静态方法

  如:String类中的valueOf()方法:public static String valueOf(int x);

 /**
* 实现方法的引用接口
* @param <P>引用方法的参数类型
* @param <R>引用方法的返回类型
*/
interface MyInterface<P,R>{
public R function(P p);//和String.valueOf(int x)类似
} interface MyInterface1{
String function(Integer a);
} public class Main { public static void test(MyInterface1 myInterface1){
String result = myInterface1.function(2000);
System.out.println(result+" --");
} public static void main(String[] args) { //匿名内部类实现
test(new MyInterface1() {
@Override
public String function(Integer a) {
return String.valueOf(a);
}
}); //Lamda表达式实现
test((a)->String.valueOf(a)); //方法引用实现:引用类的静态方法
MyInterface<Integer,String> msg = String::valueOf;
String str = msg.function(2000);
System.out.println(str);
}
}

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

  如:String类中的toUpperCase()方法:public String toUpperCase();

  这个方法没有参数,但是有返回值,并且这个方法一定要在有实例化对象的时候才可以调用。

 interface MyInterface2<R>{
public R upper();
}
public class Main1 {
public static void main(String[] args) {
String str = new String("hello");
MyInterface2<String> msg = str::toUpperCase;
System.out.println(msg.upper());//调用upper方法,就相当于调用toUpperCase方法
}
}

  在上面的演示中已经发现,如果要实现方法的引用,就必须要有接口,并且这个接口中只能存在一个方法,否则方法是无法进行引用的。

  所以为了保证被引用的接口里面只能够定义一个方法,就要在接口上加以限制,使用@FunctionalInterface 注解。

 @FunctionalInterface   //此为函数式接口,只能够定义一个方法
interface MyInterface2<R>{
public R upper();
}

引用某个类型的任意对象的实例的普通方法

  比如:String类中的compareTo(String str1,String str2)方法 public int compareTo(String anotherString);

  如果要进行比较的话,比较的形式:字符串1对象.compareTo(字符串2对象),要准备两个参数。

 @FunctionalInterface   //此为函数式接口,只能够定义一个方法
interface MyInterface3<P>{
public int compare(P p1,P p2);
}
public class Main2 {
public static void main(String[] args) {
MyInterface3<String> msg = String::compareTo;
System.out.println(msg.compare("A","B"));
}
}

  与之前相比,方法引用前不需要再定义对象,而是可以理解为将对象定义在了参数中。

引用构造方法

 @FunctionalInterface   //此为函数式接口,只能够定义一个方法
interface MyInterface4<C>{
public C person(String n,int a);
}
class Person{
private String name;
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Main3 {
public static void main(String[] args) {
MyInterface4<Person> msg = Person::new;//引用构造方法
Person person = msg.person("小明",20);
System.out.println(person);
}
}

  小结:有点毁三观的感觉!

JAVA8新特性——方法引用的更多相关文章

  1. Java8 新特性 方法引用

    什么是方法引用   方法引用可以被看作仅仅调用特定方法的Lamdba表达式的一种快捷方式.比如说Lamdba代表的只是直接调用这个方法,最好还是用名称来调用它,可不用用对象.方法名(),方法引用,引用 ...

  2. java8新特性——方法引用与构造器引用

    上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...

  3. java8新特性-方法引用

    方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用 (可以将方法引用理解为 Lambda 表达式的另外一种表现形式) 1. 对象的引用 :: 实例方法名2. 类名 :: 静 ...

  4. Java8新特性 - 方法引用与构造器引用

    方法引用 若Lambda体中的内容有方法已经实现了,我们可以使用"方法应用",可以理解为方法引用是Lambda表达式的另外一种表现形式. 使用操作符"::"将方 ...

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

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

  6. Java8新特性—四大内置函数式接口

    Java8新特性--四大内置函数式接口 预备知识 背景 Lambda 的设计者们为了让现有的功能与 Lambda 表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念. 什么是函数式接口? 函数 ...

  7. Java8新特性之二:方法引用

    上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...

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

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

  9. 乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

随机推荐

  1. 【BZOJ2969】矩形粉刷 概率+容斥

    [BZOJ2969]矩形粉刷 Description 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以 ...

  2. 【BZOJ3944/4805】Sum/欧拉函数求和 杜教筛

    [BZOJ3944]Sum Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用 ...

  3. Happy Necklace(矩阵快速幂)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...

  4. SharePoint服务器端对象模型 之 访问文件和文件夹(Part 1)

    本节中所阐述的内容,主要适用于SharePoint文档库中的文件和文件夹,以及列表中的文件夹.系统中的其他文件(如_layouts中的文件.配置文件.程序文件等)不在本章节的讨论范围之内.   (一) ...

  5. fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory

    stdint.h是c99标准的头文件,vc不支持,所以肯定会提示“No such file or directory”的. stdint.h是C99的标准,主要用于统一跨平台数据定义. MSVC中不带 ...

  6. JavaScript事件onblur与onfocus区别

    一.onblur 1.1 说明 onblur属性在元素失去焦点时触发,onblur常用于表单验证代码(例如用户离开表单字段). 1.2 示例 <input type="text&quo ...

  7. mono下c#和c交互,字符串处理

    起因是ulua里,从luajit读字符串到c#里,做了编码转换,如下 public static string lua_tostring(IntPtr luaState, int index) { v ...

  8. python函数回顾:min()

    描述 min() 方法返回给定参数的最小值,参数可以为序列. 语法 以下是 min() 方法的语法: min( x, y, z, .... ) 参数 x -- 数值表达式. y -- 数值表达式. z ...

  9. app是什么意思?智能手机的第三方应用程序

    APP,在手机中的意思就是application的简称,也就是应用程序的意思,一般指手机软件,是安装在手机上的软件,完善原始系统的不足与个性化.APP是智能手机的第三方应用程序,app通常分为个人用户 ...

  10. 20170524 委外采购的物料BOM

    目标:找委外采购订单BOM, 我的方法:1.直接在电脑中搜索关键字:2.到系统中找数据查询3.委外采购订单系统如何操作? 数据怎么做, 实施: 结果:MDBAEKET, "采购订单项目计划行 ...