Java新特性05 方法引用

一. 定义

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。

方法引用是Lambda表达式的一种简写形式;

如果Lambda表达式只是调用一个特定的已经存在的方法,则可以使用方法引用;

如果你觉得Lambda的方法体会很长,影响代码的可读性,则可以用方法引用来解决。

二. 语法

使用 :: 操作符将方法名与对象或类的名字分隔开。

三. 分类

(1)静态方法引用 ContainingClass::staticMethodName

(2)实例方法引用 ContainingObject::instanceMethodName

(3)一个类任意对象的实例方法引用 ContainingType::methodName

(4)构造方法引用 ClassName::new

Note: Lambda表达式是对匿名内部类的简写,而方法引用是对Lambda表达式的简写

四. 举例

1 package com.test.a;
2
3 public interface Base {
4     public void f3();
5 }

(1)静态方法引用

 1 package com.test.a;
 2
 3 public class Test {
 4     public static void f3() {
 5         System.out.println("hello");
 6     }
 7
 8     public static void main(String args[]) {
 9         //1. 匿名内部类的实现方式
10 //        Base base = new Base() {
11 //            @Override
12 //            public void f3() {
13 //                System.out.println("hello");
14 //            }
15 //        };
16 //        base.f3();//print "hello"
17
18 //        //2.Lambda表达式的实现方式
19 //        Base base2=()->{System.out.println("hello");};
20 //        base2.f3();//print "hello"
21
22         //3.实例方法引用的实现方式
23         Test test=new Test();
24         Base base3=Test::f3;
25         base3.f3();//print "hello"
26
27
28     }
29 }

(2)实例方法引用

 1 package com.test.a;
 2
 3 public class Test {
 4     public void f3() {
 5         System.out.println("hello");
 6     }
 7
 8     public static void main(String args[]) {
 9         //1. 匿名内部类的实现方式
10 //        Base base = new Base() {
11 //            @Override
12 //            public void f3() {
13 //                System.out.println("hello");
14 //            }
15 //        };
16 //        base.f3();//print "hello"
17
18 //        //2.Lambda表达式的实现方式
19 //        Base base2=()->{System.out.println("hello");};
20 //        base2.f3();//print "hello"
21
22         //3.实例方法引用的实现方式
23         Test test=new Test();
24         Base base3=test::f3;
25         base3.f3();//print "hello"
26
27
28     }
29 }

Note:这个Lambda内部表达式f3方法已经有一个具体的实现方法了,因此直接引用就可以了。

(3)一个类任意对象的实例方法引用

 1 package com.test.a;
 2
 3 import java.util.ArrayList;
 4 import java.util.Collections;
 5 import java.util.Comparator;
 6 import java.util.List;
 7
 8 public class Test {
 9     public static void main(String args[]) {
10         List<String> list=new ArrayList<>();
11         list.add("d");
12         list.add("a");
13         list.add("c");
14         list.add("b");
15
16 //        Collections.sort(list, new Comparator<String>() {
17 //
18 //            @Override
19 //            public int compare(String o1, String o2) {
20 //                // TODO Auto-generated method stub
21 //                return o1.compareTo(o2);
22 //            }
23 //        });
24
25 //        Collections.sort(list, (o1,o2)->{return o1.compareTo(o2);});
26
27         //简化Lambda,那么我们必须有一个compareTo方法的具体实现的一个方法,发现String类已经有compareTo的具体实现了,可以直接用
28         Collections.sort(list, String::compareTo);
29
30         for(String s:list) {
31             System.out.println(s);
32         }
33
34     }
35 }

(4)构造方法引用

 1 package com.test.a;
 2
 3 public class Person {
 4     public String name;
 5     public int age;
 6
 7     public String getName() {
 8         return name;
 9     }
10
11     public void setName(String name) {
12         this.name = name;
13     }
14
15     public int getAge() {
16         return age;
17     }
18
19     public void setAge(int age) {
20         this.age = age;
21     }
22 }

 1 package com.test.a;
 2
 3 import java.util.function.Supplier;
 4
 5 public class Test {
 6     public static void main(String args[]) {
 7         Supplier<Person> supplier=()->new Person();
 8         Person person=supplier.get();
 9         System.out.println(person);
10
11         Supplier<Person> supplier2=Person::new;
12         Person person2=supplier2.get();
13         System.out.println(person2);
14     }
15 }

1 [email protected]
2 [email protected]

原文地址:https://www.cnblogs.com/Hermioner/p/9663193.html

时间: 2024-10-30 19:08:39

Java新特性05 方法引用的相关文章

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

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

Java 8新特性-4 方法引用

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

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

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

Jdk8新特性之方法引用

方法引用的格式 符号表示 : :: 符号说明 : 双冒号为方法引用运算符,而它所在的表达式被称为方法引用.应用场景 : 如果Lambda所要实现的方案 , 已经有其他方法存在相同方案,那么则可以使用方法引用.方法引用在JDK 8中使用方式相当灵活,有以下几种形式: 1. instanceName::methodName 对象::方法名2. ClassName::staticMethodName 类名::静态方法3. ClassName::methodName 类名::普通方法4. ClassNa

Java8 新特性3——方法引用与构造器引用

方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!)方法引用:使用操作符 "::" 将方法名和对象或类的名字分隔开来. 三种主要使用情况 : 对象::实例方法 类::静态方法 类::实例方法 //例如 (x) -> System.out.println(x); //等同于 System.out::println //例如 BinaryOperator<Double> bo =

JAVASE课程 第一章 第四讲方法,数组,java新特性

作用: 1.可以了解方法的申明和使用 2.可以了解数组的引用传递 3.可以了解java新特性对数组的支持 一 方法的申明和使用 1 方法的定义 方法就是一段可重复调用的代码块. 2 方法的定义格式 a public static 返回值类型 方法名称(类型参数1,类型参数2...){ 方法主体: 程序语句 [return 表达式;] } b 在本节定义的方法,因为其可以直接使用主方法调用,所以将方法声明处加上public static两个关键字 c 注意 1/ 如果返回值类型上写的是void,则

JAVA学习-Java新特性(泛型、枚举、Annotation)

所谓的Java新特性现在都是指从JDK 1.5之后开始的,例如,在前面已经学习过两个新特性:switch支持String判断(JDK 1.7提供的).自动装箱和拆箱.可变参数.foreach.静态导入.泛型.枚举.Annotation. 对于所有的新特性,我的个人建议:有些新特性你今天一定是不知道怎么用的,我们今天只是来看一下这些语法,至于使用方面,慢慢来观察. 1.可变参数(理解) 如果说现在有这样一个要求,要求实现整数的加法操作,并且方法可以接收任意多个整型数据一起实现加法操作. 如果按照传

主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙

1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一个新特性. 主流的单元测试工具之-JAVA新特性-Annotation - groupthreetogether - group博客 2:元数据的简单介绍: @Before:使用了该元数据的方法在每个测试方法执行之前都要执行一次. @After:使用了该元数据的方法在每个测试方法执行之后要执行一次.

C++新特性 右值引用 移动构造函数

1.右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题.但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision.RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝.下面简单地介绍一下Copy Elision.RVO,对此不感兴趣的可以直接跳过: (1) Copy Elision Copy Elision技术是为了防止某些不必要的临时对象产生和拷贝,例如: struct A { A(int)