jdk1.8的lambda语法(转)

原文链接:http://www.jb51.net/article/115081.htm

代码:

package com.jdk_8;

import org.junit.Test;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

/**
 * Created by zhen on 2017-07-04.
 */
public class LambdaTest {
    /**
     * 函数式接口(function interface也叫功能性接口,其实是同一个东西)。简单来说,函数式接口只是包含一个方法的接口。比如java标准库中的
     * java.lang.Runnable和java.util.Comparator都是典型的函数式接口。java 8 提供@FunctionInterface注解是必须的,只要接口复合函数式接口
     * 的标准(即只包含一个抽象方法的接口),虚拟机会自动判断,但最好在接口上使用@FunctionInterface进行声明,以便其他人在接口中添加方法
     * 。java的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现。
     *
     * Lambda语法:
     *  包含三个部分
     *  1、一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数
     *  2、一个箭头符号:->
     *  3、方法体,可以是表达式和代码块,方法体函数接口里面方法的实现,如果是代码块,必须用{}来包裹起来,而且需要一个return返回值,但是
     *  有个例外,若函数式接口里面的方法返回值是void,则无需{}
     */

    public void test1(){
        runThreadUseInnerClass();
        runThreadUseLambda();
    }

    public void runThreadUseLambda(){
        new Thread(() -> System.out.println("lambda实现的线程")).start();
    }
    public void runThreadUseInnerClass(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("内部类实现的线程");
            }
        }).start();
    }

    /**
     * 方法引用
     *  其实是lambda表达式的一个简化写法,所引用的方法起始是lambda表达式的方法实现,语法也很简单,左边是容器(可以是类名、实例名),中间
     *  是“::”,右边是相应的方法名。
     *  1、如果是静态方法,则是ClassName::methodName
     *  2、如果是实例方法,则是Instance::methodName
     *  3、构造函数,则是ClassName::new
     */
    @Test
    public void testMethodReference(){
        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,是一个函数式接口
        button1.addActionListener((e) -> {System.out.println("这里是Lambda的实现方式");});
        button2.addActionListener(LambdaTest::doSomething);
        /**
         * 这里生成的窗体不能持久,可能少了点代码,忽略
         * 可以看出,doSomething方法就是lambda表达式的实现,这样的好处就是,如果你觉得lambda的方法体会很长,影响代码可读性,方法引用就是个解决办法
         */
    }
    public static void doSomething(ActionEvent e){
        System.out.println("这里是方法引用的实现方式");
    }

    /**
     * 以上就是lambda表达式语法的全部内容了。只是diamante简介这个好处的话,并不能打动很多观众,java 8 也不会那么令人期待,java 8 迫切引
     * 入lambda是因为lambda表达式能简化集合上数据的多线程或者多核的处理,提供更快的集合处理速度
     */
}
原文地址:https://www.cnblogs.com/aigeileshei/p/7116486.html