java8新特性之 lambda 篇

  java 8引入lambda迫切需求是因为lambda 表达式能简化集合上数据的多线程或者多核的处理,提供更快的集合处理速度  

函数式接口

  Java 8 引入的一个核心概念是函数式接口(Functional Interfaces)。通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行。如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。同时,引入了一个新的注解:@FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解 @FunctionalInterface 进行声明。在接口中添加了 @FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错,可以拥有若干个默认方法。

java.lang.Runnable 就是一个函数式接口。

@FunctionalInterface
public interface Runnable {
  public abstract void run();
}

  

lambda表达式

  Java中的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现。

  lambda语法包含三个部分:

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

    2)一个箭头符号: ->

    3)方法体,可以是表达式和代码块,方法体函数式接口里面的方法实现,如果是代码块要用{ }包起来,并且需要 return 返回值,如果方法返回值是 void 则不需要 { }

/**
 * @description: lambda表达式
 * @author: liuxin
 * @create: 2019-01-26 18:39
 **/
public class Test {
    private static void runNew(){
        /*
        * Runnable是一个函数接口,只包含一个无参数返回void的run方法
        * 所以lambda表达式没有参数也没有return
        * */
        new Thread(()-> System.out.println("lambda方法")).start();
    }

    private static void runOld(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("内部类实现方法");
            }
        }).start();
    }

    public static void main(String[] args) {
        Test.runNew();
        Test.runOld();
    }
}

  使用lambda表达式可以使代码更加简洁的同时保持可读性。

方法引用

方法引用是lambda表达式的一个简化写法,引用的方法其实是表达式的方法体实现,语法非常简单,左边是容器(类名,实例名)中间是“” :: “”,右边则是相应的方法名。

ObjectReference::methodName  
  引用格式:
    1)静态方法:ClassName::methodName。例如 Object::equals
    2)实例方法:Instance::menthodName。例如 Object obj =new Object();obj::equals
    3)构造函数:ClassName::new
/**
 * @description: 方法引用
 * @author: liuxin
 * @create: 2019-01-26 18:58
 **/
public class TestMethod {
    public static void main(String[] args) {
        ArrayList<Integer> a =new ArrayList<>();
        a.add(1);
        a.add(2);
        //这里addActionListener方法的参数是ActionListener,是一个函数式接口
        //使用lambda表达式方式
        a.forEach(e -> { System.out.println("Lambda实现方式"); });
        //使用方法引用方式
        a.forEach(TestMethod::sys);

    }
    
    
    public static void sys(Integer e) {
        System.out.println("方法引用实现方式");

    }
}

这里的sys()方法就是lambda表达式的实现,这样的好处是,当方法体过长影响代码可读性时,可以使用方法引用。

猜你喜欢

转载自www.cnblogs.com/xiaoxiaoliu/p/10324663.html