Java 8 新特性:Lambda表达式

概述

Lambda表达式是Java SE 8中包含的一个新的重要特性。Lambda表达式提供了简洁清晰的方式来代替方法接口。Lambda也提升了从一个集合里爬取数据、过滤、迭代的易用性。此外新的并发性,提高了多核环境中的性能。

Lambda表示式语法

java lambda 返回对象指定字段集合 java lambda表达式返回值_java

主体部分可以是一个表达式或者语句块。在表达式形式中,主体部分是一个简单的返回值,在语句块形式中,主体部分类似于方法体,将返回值返回给匿名方法的调用方。breakcontinue在最高级别中是非法的,但是在循环中是可以使用的。如果主体部分返回结果,那么每一个控制部分必须有返回值或者抛出异常。

例如:

(int x, int y) -> x + y

() -> 42

(String s) -> { System.out.println(s); }

第一个表达式取了两个参数,命名为xy,以表达式形式返回x+y。第二个表达式提取元参,并以表达式形式返回一个整数型42。第三个表达式取一个字符串类型参数,以语句块形式向控制台输出,且无返回值。

Lambda 示例程序

基于Lambda实现Runnable

@Test
public void lambda_runnable_test() {

    // 匿名内部类实现runnable
    Runnable r1 = new Runnable() {
        @Override
        public void run() {
            System.out.println("使用匿名内部类实现Runnable");
        }
    };

    /*
     *  使用Lambda形式实现Runnable
     *  注意:如果主体只包含一个语句块,那么{}可以省略
     */
//      Runnable r2 = () -> { System.out.println("使用Lambda形式实现Runnable") };
    Runnable r2 = () -> System.out.println("使用Lambda形式实现Runnable");

    r1.run();
    r2.run();

}

集合比较器-Comparator Lambda

/**
 * 集合比较器Comparator Lambda示例
 */
@Test
public void comparator_lambda_test() {
    List<Person> personList = Person.createShortList();

    // 使用匿名内部类排序
    Collections.sort(personList, new Comparator<Person>() {

        @Override
        public int compare(Person o1, Person o2) {
            // TODO Auto-generated method stub
            return o1.getSurName().compareTo(o2.getSurName());
        }

    });

    System.out.println("=== 根据surName倒序排列:基于匿名内部类排序 ===");
    for (Person person : personList) {
        person.printName();
    }

    System.out.println("=== 根据surName升序排列:基于Lambda表达式排序 ===");
    Collections.sort(personList, (Person p1, Person p2) -> p1.getSurName().compareTo(p2.getSurName()));
    for (Person person : personList) {
        person.printName();
    }

    System.out.println("=== 根据surName倒序排列:基于Lambda表达式排序 ===");
    Collections.sort(personList, (Person p1, Person p2) -> p2.getSurName().compareTo(p1.getSurName()));
    for (Person person : personList) {
        person.printName();
    }

}

该示例中引用了一个Person类,可参考博文下方源代码

基于Lambda进行事件处理

/**
 * Listener 监听器 Lambda程序示例
 */
@Test
public void listener_lambda_test() {

    JButton button = new JButton("Test Button");
    // 添加监听器
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("通过匿名内部类点击按扭");
        }
    });
    // 通过Lambda点击按扭
    button.addActionListener(e -> System.out.println("通过Lambda点击按扭"));

    // Swing stuff
    JFrame frame = new JFrame("Listener Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(button, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);

}

基于Lambda集合迭代

/**
* 集合迭代Lambda示例
 */
@Test
public void foreach_lambda_test() {

    List<String> languages = Arrays.asList("SpringBoot","SpringCloud","SpringMVC","MyBatis");

    System.out.println("==== jdk 8 之前遍历 =====");
    // jdk 8 之前遍历
    for (String language : languages) {
        System.out.println(language + "\t");
    }

    System.out.println("==== 基于Lambda表达式迭代 =====");
    // 基于Lambda表达式迭代
    languages.forEach(language -> System.out.println(language + "\t"));

    System.out.println("==== 基于jdk8方法引用 =====");
    // 基于jdk8方法引用
    languages.forEach(System.out::println);

}

源代码链接:
https://github.com/myNameIssls/javase-study/tree/master/java-example/src/main/java/cn/tyrone/java/example/java8/lambda

参考链接:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html#overview
http://www.importnew.com/16436.html
http://www.runoob.com/java/java8-lambda-expressions.html