Rumah Java javaTutorial Java8新特性之Lambda表达式浅析

Java8新特性之Lambda表达式浅析

Jan 23, 2017 pm 03:33 PM

说到java 8,首先会想到lambda(闭包)以及虚拟扩展方法(default method),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java 8系列开篇要讲的第一特性(JEP126 http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java 8新特性有着重要的意义。

一、函数式接口

函数式接口(functional interface 也叫功能性接口,其实是同一个东西)。简单来说,函数式接口是只包含一个方法的接口。比如Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口。java 8提供 @FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断,但 最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。 
Java中的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现,下面讲到语法会讲到

二、Lambda语法

包含三个部分

1.一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数

2.一个箭头符号:->

3.方法体,可以是表达式和代码块,方法体函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return 返回值,但有个例外,若函数式接口里面方法返回值是void,则无需{}

总体看起来像这样:

(parameters) -> expression 或者 (parameters) -> { statements; }
Salin selepas log masuk

看一个完整的例子,方便理解

/**
 * 测试lambda表达式
 *
 * @author benhail
 */
public class TestLambda {
    public static void runThreadUseLambda() {
        //Runnable是一个函数接口,只包含了有个无参数的,返回void的run方法;
        //所以lambda表达式左边没有参数,右边也没有return,只是单纯的打印一句话
        new Thread(() ->System.out.println("lambda实现的线程")).start(); 
    }
    public static void runThreadUseInnerClass() {
        //这种方式就不多讲了,以前旧版本比较常见的做法
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("内部类实现的线程");
            }
        }).start();
    }
    public static void main(String[] args) {
        TestLambda.runThreadUseLambda();
        TestLambda.runThreadUseInnerClass();
    }
}
Salin selepas log masuk

可以看出,使用lambda表达式设计的代码会更加简洁,而且还可读。

三、方法引用

其实是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现,语法也很简单,左边是容器(可以是类名,实例名),中间是"::",右边是相应的方法名。如下所示:

ObjectReference::methodName
Salin selepas log masuk

一般方法的引用格式是

如果是静态方法,则是ClassName::methodName。如 Object ::equals

如果是实例方法,则是Instance::methodName。如Object obj=new Object();obj::equals;

构造函数.则是ClassName::new

再来看一个完整的例子,方便理解:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
 *
 * @author benhail
 */
public class TestMethodReference {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout());
        frame.setVisible(true);

        JButton button1 = new JButton("点我!");
        JButton button2 = new JButton("也点我!");

        frame.getContentPane().add(button1);
        frame.getContentPane().add(button2);
        //这里addActionListener方法的参数是ActionListener,是一个函数式接口
        //使用lambda表达式方式
        button1.addActionListener(e -> { System.out.println("这里是Lambda实现方式"); });
        //使用方法引用方式
        button2.addActionListener(TestMethodReference::doSomething);

    }
    /**
     * 这里是函数式接口ActionListener的实现方法
     * @param e 
     */
    public static void doSomething(ActionEvent e) {

        System.out.println("这里是方法引用实现方式");

    }
}
Salin selepas log masuk

可以看出,doSomething方法就是lambda表达式的实现,这样的好处就是,如果你觉得lambda的方法体会很长,影响代码可读性,方法引用就是个解决办法

四、总结

以上就是lambda表达式语法的全部内容了,相信大家对lambda表达式都有一定的理解了,但只是代码简洁了这个好处的话,并不能打动很多观众,java 8也不会这么令人期待,其实java 8引入lambda迫切需求是因为lambda 表达式能简化集合上数据的多线程或者多核的处理,提供更快的集合处理速度 ,这个后续会讲到,关于JEP126的这一特性,将分3部分,之所以分开,是因为这一特性可写的东西太多了,这部分让读者熟悉lambda表达式以及方法引用的语法和概念,第二部分则是虚拟扩展方法(default method)的内容,最后一部分则是大数据集合的处理,解开lambda表达式的最强作用的神秘面纱。

更多Java8新特性之Lambda表达式浅析相关文章请关注PHP中文网!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Dalam debugging jauh Java, bagaimana untuk mendapatkan nilai malar dengan betul pada pelayan jauh? Dalam debugging jauh Java, bagaimana untuk mendapatkan nilai malar dengan betul pada pelayan jauh? Apr 19, 2025 pm 01:54 PM

Soalan dan jawapan mengenai pengambilalihan berterusan dalam debugging jauh Java Apabila menggunakan Java untuk debugging jauh, banyak pemaju mungkin menghadapi beberapa fenomena yang sukar. Ia ...

Apabila Tomcat memuat modul Spring-Web, adakah mekanisme SPI benar-benar memusnahkan prinsip penglihatan Java Class Loaders? Apabila Tomcat memuat modul Spring-Web, adakah mekanisme SPI benar-benar memusnahkan prinsip penglihatan Java Class Loaders? Apr 19, 2025 pm 02:18 PM

Analisis tingkah laku pemuatan kelas mekanisme SPI apabila Tomcat memuat modul-modul Spring-Web. Tomcat digunakan untuk menemui dan menggunakan servle yang disediakan oleh Spring-Web semasa memuatkan modul Web Spring ...

Apakah sebab mengapa penyemak imbas tidak bertindak balas selepas pelayan WebSocket mengembalikan 401? Bagaimana menyelesaikannya? Apakah sebab mengapa penyemak imbas tidak bertindak balas selepas pelayan WebSocket mengembalikan 401? Bagaimana menyelesaikannya? Apr 19, 2025 pm 02:21 PM

Kaedah tidak responsif penyemak imbas selepas pelayan WebSocket mengembalikan 401. Apabila menggunakan Netty untuk membangunkan pelayan WebSocket, anda sering menghadapi keperluan untuk mengesahkan token. � ...

Kenapa ia melaporkan kesilapan ketika mengemukakan pekerjaan pyfliin di benang? Kenapa ia melaporkan kesilapan ketika mengemukakan pekerjaan pyfliin di benang? Apr 19, 2025 pm 02:06 PM

Analisis Sebab Mengapa Skrip Python Tidak Dapat Ditemui Semasa Mengemukakan Pekerja

Bagaimana untuk mengubahsuai parameter SavePath secara dinamik @Excel Annotation di Easypoi apabila projek bermula di Java? Bagaimana untuk mengubahsuai parameter SavePath secara dinamik @Excel Annotation di Easypoi apabila projek bermula di Java? Apr 19, 2025 pm 02:09 PM

Cara Konfigurasi secara dinamik parameter anotasi kelas entiti dalam Java semasa proses pembangunan, kita sering menghadapi keperluan untuk mengkonfigurasi parameter anotasi secara dinamik mengikut persekitaran yang berbeza ...

Bagaimana untuk memilih alat pengurusan projek Java ketika mempelajari pembangunan back-end? Bagaimana untuk memilih alat pengurusan projek Java ketika mempelajari pembangunan back-end? Apr 19, 2025 pm 02:15 PM

Keliru dengan memilih alat pengurusan projek Java untuk pemula. Bagi mereka yang baru mula belajar pembangunan backend, memilih alat pengurusan projek yang tepat adalah penting ...

Konsistensi utama dalam sistem yang diedarkan: Bagaimana untuk memohon dan bagaimana untuk mengimbangi ketidakkonsistenan data? Konsistensi utama dalam sistem yang diedarkan: Bagaimana untuk memohon dan bagaimana untuk mengimbangi ketidakkonsistenan data? Apr 19, 2025 pm 02:24 PM

Meneroka penerapan konsistensi muktamad dalam sistem yang diedarkan pemprosesan transaksi yang diedarkan selalu menjadi masalah dalam seni bina sistem yang diedarkan. Untuk menyelesaikan masalah ...

Bagaimana untuk menyekat akses ke antara muka tertentu halaman H5 bersarang melalui mekanisme skop OAuth2.0? Bagaimana untuk menyekat akses ke antara muka tertentu halaman H5 bersarang melalui mekanisme skop OAuth2.0? Apr 19, 2025 pm 02:30 PM

Bagaimana untuk menggunakan OAuth2.0's Access_Token untuk mencapai kawalan keizinan akses antara muka? Dalam permohonan OAuth2.0, bagaimana memastikan ...

See all articles