Rumah > Java > javaTutorial > Analisis mendalam tentang rujukan kaedah di Jawa

Analisis mendalam tentang rujukan kaedah di Jawa

WBOY
Lepaskan: 2022-06-14 19:11:34
ke hadapan
2404 orang telah melayarinya

Artikel ini membawa anda pengetahuan yang berkaitan tentang java, yang terutamanya memperkenalkan isu berkaitan tentang rujukan kaedah Semua orang tahu kaedah, iaitu kaedah yang kami tentukan semasa menulis kod. Rujukan kaedah ialah apa yang digunakan untuk merujuk kaedah ini. Kaedah rujukan menjelaskan bahawa tujuannya adalah untuk mengoptimumkan lagi ungkapan Lambda, dengan itu mengurangkan kod untuk ditulis dengan lebih mudah.

Analisis mendalam tentang rujukan kaedah di Jawa

Kajian yang disyorkan: "tutorial video java"

Apakah rujukan kaedah?

Sebenarnya, kami mula memahaminya secara literal Semua orang tahu kaedahnya, iaitu kaedah yang kami tentukan semasa menulis kod. Rujukan kaedah ialah apa yang digunakan untuk merujuk kaedah ini. Kaedah rujukan menjelaskan bahawa tujuannya adalah untuk mengoptimumkan lagi ungkapan Lambda, dengan itu mengurangkan kod untuk ditulis dengan lebih ringkas. betul! Anda dengar betul, ungkapan Lambda sudah sangat dioptimumkan, jadi bagaimanakah ia boleh dioptimumkan? Apabila kelas, objek, super, dan ini yang sepadan muncul dalam kod kami, kami boleh menggunakan rujukan kaedah Premis rujukan kaedah ini ialah kami mempunyai ungkapan Lambda. Jadi bagaimana ia digunakan? Mari kita teruskan melihat ke bawah.

Petikan Kaedah

Memandangkan tajuk adalah petikan kaedah, apakah petikan kaedah? Operator rujukan kaedah ialah double titik [::] Ini ialah rujukan kaedah, dan ini juga merupakan sintaks baharu pengendali rujukan, dan rujukan kaedah dilaksanakan ia. Jika penyelesaian fungsi yang akan dinyatakan oleh Lambda sudah wujud dalam pelaksanaan kaedah, kita boleh menggunakan dua titik untuk merujuk kaedah menggantikan Lambda.

Nota: Parameter yang diluluskan dalam Lambda mestilah daripada jenis yang boleh diterima oleh kaedah dalam rujukan kaedah, jika tidak pengecualian akan dilemparkan.

Bagaimana untuk menggunakan rujukan kaedah?

Rujukan kaedah boleh digunakan dengan cara berikut:

Analisis mendalam tentang rujukan kaedah di Jawa

Memandangkan terdapat rujukan kaedah dalam cara di atas, mari kita kaji satu persatu ia cuba.

Merujuk kepada kaedah ahli melalui nama objek

Jadi bagaimana untuk merujuk kaedah melalui nama objek? Kita tahu bahawa objek dicipta melalui kelas, jadi kita perlu mencipta kelas dahulu, kemudian menentukan kaedah ahli dalam kelas, kemudian mencipta objek melalui kelas, dan menggunakan pasangan untuk merujuk kaedah ahli.

Contohnya:

Tentukan kaedah ahli, lulus rentetan dan keluarkan rentetan dalam huruf besar

Kami meletakkan keperluan di atas ke dalam Mari laksanakannya.

Mula-mula tentukan kelas

public class Demo02MethodRerObject {

//定义一个成员方法,传递字符串,把字符串按照大写输出

public void printUpperCaseString(String s){

System.out.println(s.toUpperCase());

}

}
Salin selepas log masuk

Memandangkan ia adalah output, kita perlu mencetaknya dan menggunakan Lambdab memerlukan kita untuk mentakrifkan antara muka berfungsi untuk mencetak dan mentakrifkan aksara percetakan dalam fungsian. antara muka Kaedah abstrak rentetan.

/*

定义一个打印的函数式接口

*/

@FunctionalInterface

public interface Printable {

//定义打印字符串的抽象方法

void print(String s);

}
Salin selepas log masuk

Dan untuk merujuk kaedah ahli melalui nama objek, premisnya ialah nama objek sudah wujud dan kaedah ahli juga wujud Anda boleh menggunakan nama objek untuk merujuk kaedah ahli. Mari tulis dalam kod: Pertama, kami menggunakan Lambda untuk menulis keperluan ini, dan kemudian kami menggunakan rujukan kaedah untuk mengoptimumkan Lambda.

public class Demo03ObjectMethodReference {

//定义一个方法,方法参数传递Printable接口

public static void pringString(Printable p){

p.print("abcde");

}

public static void main(String[] args) {

//pringString(System.out::print);

//调用printString方法,方法的参数pringable是一个函数式接口,所以可以传递Lambda

pringString((s)->{

//创建MethodRerObject对象

Demo02MethodRerObject methodRerObject=new Demo02MethodRerObject();

//调用Demo02MethodRerObject对象中的成员方法printUpperCaseString,把字符串按照大写输出

methodRerObject.printUpperCaseString(s);

});

/*

使用方法引用优化Lambda

对象已经存在Demo02MethodRerObject

成员方法也是已经存在的printUpperCaseString

所以我们可以使用对象名引用成员方法

*/

Demo02MethodRerObject methodRerObject=new Demo02MethodRerObject();

pringString(methodRerObject::printUpperCaseString);

}

}
Salin selepas log masuk

Merujuk kepada kaedah statik melalui nama kelas

Kami telah belajar sebelum ini bahawa apabila terdapat kaedah statik dalam kelas kami, kami boleh memanggil kaedah statik melalui nama kelas, dan kaedah Begitu juga untuk rujukan Anda juga boleh merujuk kaedah statik melalui nama kelas. Di bawah kami juga menggunakan kod untuk menunjukkan.

Kali ini kita mentakrifkan kaedah Parameter kaedah diluluskan untuk mengira nilai mutlak integer dan antara muka berfungsi Calcable.

Tentukan dahulu antara muka

@FunctionalInterface

public interface Calcable {

//定义一个抽象方法,传递一个整数,对整数进行绝对值计算并返回

int AbsCals(int number);

}
Salin selepas log masuk

Gunakan nama kelas untuk merujuk kaedah ahli statik Jika kelas sudah wujud dan kaedah ahli statik juga wujud, anda boleh merujuk secara langsung ahli statik melalui kaedah nama kelas. Kami juga mencipta kelas terlebih dahulu, mentakrifkan kaedah, menulis kod dengan Lambda, dan kemudian menggunakan pengoptimuman rujukan kaedah.

public class Demo04StaticMethodReference {

//定义一个方法,方法的参数传递计算绝对值的整数和函数式接口Calcable

public static int method1(int number,Calcable c){

return c.AbsCals(number);

}

public static void main(String[] args) {

//调用method方法,传递计算绝对值的整数和lambda表达式

int number=method1(-10,(n)->{

//对参数进行绝对值计算并返回结果

return Math.abs(n);

});

System.out.println(number);

/*

使用方法引用优化Lambdab表达式

Math类是存在的

abs计算绝对值的静态方法也是存在的

所以我们可以直接通过类名引用静态方法

*/

int number2=method1(-10, Math::abs);

System.out.println(number2);

}

}
Salin selepas log masuk

Merujuk kepada kaedah ahli melalui super

Disebutkan bahawa super description adalah berkaitan dengan kaedah kelas induk, iaitu terdapat hubungan warisan. Apabila terdapat perhubungan warisan dan super dipanggil dalam Lambda, sebaliknya kita mempunyai rujukan kaedah.

Tentukan kaedah pertemuan

Kami menggunakan kaedah pertemuan dan salam antara kelas anak dan ibu bapa untuk demonstrasi

Begitu juga kali ini kami tentukan kaedah mesyuarat Antara muka berfungsi

/*

定义见面的函数式接口

*/

@FunctionalInterface

public interface Greetable {

//定义一个见面的方法

void greet();

}
Salin selepas log masuk

Memandangkan kita perlu mewarisi, kita mentakrifkan kelas induk

/*

定义父类方法

*/

public class Demo05Fu_Human {

//定义一个sayHello的方法

public void sayHello(){

System.out.println("Hello! 我是Human。");

}

}
Salin selepas log masuk

        再定义一个子类,在子类中出现父类的成员方法,先使用Lambda编写代码,再进行方法引用优化。

        使用super引用父类的成员方法,前提super是已经存在的,父类的成员方法也是存在的,就可以直接使用super引用父类成员方法。

import java.nio.channels.ShutdownChannelGroupException;

/*

定义子类

*/

public class Demo06Zi_Man extends Demo05Fu_Human {

//子类重写父类sayHello方法

@Override

public void sayHello() {

System.out.println("Hello!我是Man。");

}

//定义一个方法,参数传递Gerrtable接口

public void method(Greetable g){

g.greet();

}

public void show(){

//调用method方法,方法参数Greetable是一个函数式接口,所以可以传递Lambda表达式

method(()->{

//创建父类的Human对象

Demo05Fu_Human fHuman=new Demo05Fu_Human();

fHuman.sayHello();

});

//因为有子父类关系,所以存在的一个关键super,代表父类,可以直接使用super调用父类的成员方法

method(()->{

super.sayHello();

});

/*

使用super引用类的成员方法

super是已经存在的

父类的成员方法也是存在的

使用可以直接使用super引用父类成员方法

*/

method(super::sayHello);

}

public static void main(String[] args) {

//调用show方法

new Demo06Zi_Man().show();

}

}
Salin selepas log masuk

通过this引用成员方法

        既然上面用super引用了父类的成员方法,我们之前也学过this也可以调用本类的成员方法,那同样this也可以引用本类的成员方法。

示例:

定义一个买房子的方法

同样,首先定义函数式接口。

/*

定义一个富有的函数式接口

*/

@FunctionalInterface

public interface Richable {

//定义一个想买什么就买什么的方法

void buy();

}
Salin selepas log masuk

        然后怎么创建类,再定义买房子的方法。通过this引用成员方法,前提this是已经存在的,买房子的成员方法也是存在的,就可以直接使用this引用成员方法。同样先使用Lambda编写代码,再进行方法引用优化。

/*

通过this引用本类的成员方法

*/

public class Demo07_Husband {

//定义一个买房子的方法

public void buyHouse(){

System.out.println("北京二环内买一套四合院!");

}

//定义一个结婚的方法,参数传递Richable接口

public void marry(Richable r){

r.buy();

}

//定义一个高兴的方法

public void soHappy(){

//调用结婚的方法,方法的参数Richable是一个函数式接口,传递Lambda表达式

marry(()->{

//使用this,成员方法,调用本类买房子的方法

this.buyHouse();

});

/*

使用方法引用优化Lambda

this是已经存在的

买房子的成员方法也是存在的

可以直接使用this引用成员方法

*/

marry(this::buyHouse);

}

public static void main(String[] args) {

new Demo07_Husband().soHappy();

}

}
Salin selepas log masuk

类的构造器引用

        类的构造器引用也叫构造方法引用。而由于构造器名称和类名完全一样,所以构造器引用格式是这样的,类名称::new的格式表示。既然是构造器引用也就是构造方法引用,所以我们需要:

定义一个Person类。

/*

person类

*/

public class Person {

private String name;

public Person() {

super();

// TODO Auto-generated constructor stub

}

public Person(String name) {

super();

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}
Salin selepas log masuk

然后创建一个Person对象的函数式接口

*

定义一个创建erson对象的函数式接口

*/

@FunctionalInterface

public interface PersonBuilder {

//定义一个方法,根据传递的姓名,创建person对象返回

Person buliderPerson(String name);

}
Salin selepas log masuk

        再传递一个方法,参数传递姓名和PersonBulider接口,方法中通过 姓名创建Person对象。类的构造器引用,前提构造方法new Person(String name)已知,创建对象已知 new,就可以使用Person引用new创建对象。同样先使用Lambda编写代码,再进行方法引用优化。

/*

类的构造器(构造方法)引用

*/

import java.time.chrono.MinguoChronology;

import javax.print.attribute.standard.PrinterName;

public class Demo08Person {

//传递一个方法,参数传递姓名和PersonBulider接口,方法中通过 姓名创建Person对象

public static void printName(String name,PersonBuilder pb){

Person person=pb.buliderPerson(name);

System.out.println(person.getName());

}

public static void main(String[] args) {

//调用printName方法,方法的参数传递了函数式接口,我们可以使用Lambda表达式

printName("张三",(name)->{

return new Person(name);

});

/*使用方法引用优化Lambda表达式

构造方法new Person(String name)已知

创建对象已知 new

就可以使用Person引用new创建对象*/

printName("痛而不言笑而不语的浅伤",Person::new);

}

}
Salin selepas log masuk

数组的构造器引用

        数组也是Object的子类,所以它也有方法引用,只是语法上稍有不同。

示例:

定义一个方法

方法的参数传递创建数组的长度和ArrayBulider接口

方法内部根据创建的长度使用ArrayBuilder中的方法创建数组并返回

同样,先创建一个数组的函数式接口

/*

定义一个创建数组的函数式接口

*/

@FunctionalInterface

public interface ArrayBulider {

// 定义一个int类型的数组方法,参数传递数组的长度,返回创建好的int类型的数组

int[] buliderArray(int length);

}
Salin selepas log masuk

        方法的参数传递创建数组的长度和ArrayBulider接口,方法内部根据创建的长度使用ArrayBuilder中的方法创建数组并返回。前提,已知创建的就是int[]数组,数组的长度也是已知的,就可以通过数组int[]引用new,根据参数传递的长度来创建数组同样先使用Lambda编写代码,再进行方法引用优化。

import java.lang.reflect.Array;

import java.util.Arrays;

/*

数组的构造器引用

*/

public class Demo09Array_BuilderArray {

/*
定义一个方法

方法的参数传递创建数组的长度和ArrayBulider接口

方法内部根据创建的长度使用ArrayBuilder中的方法创建数组并返回

*/

public static int[] arrayLength(int length,ArrayBulider ab){

return ab.buliderArray(length);

}

public static void main(String[] args) {

//调用arrayLength方法、传递数组的长度和Lambda表达式

int[]arr=arrayLength(10,(len)->{

return new int[len];

});

System.out.println(arr.length);

/*使用方法引用优化Lambda表达式

已知创建的就是int[]数组

数组的长度也是已知的

就可以通过数组int[]引用new,根据参数传递的长度来创建数组*/

int[]arr1=arrayLength(5, int[]::new);

System.out.println(arr1.length);

System.out.println(Arrays.toString(arr1));

}

}
Salin selepas log masuk

推荐学习:《java视频教程

Atas ialah kandungan terperinci Analisis mendalam tentang rujukan kaedah di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan