JAVA8新特性lambda表达式基础

lambda表达式

概述:

lambda表达式是Java8.0版本后新增的重量级新特性,它的重量级不仅体现在简化代码,更是体现在函数式编程思想以及程序延后执行上,大大提高了编程的效率。

前提概念:

  1. 函数式编程思想:强调做什么,而不是怎么去做,是面向函数的编程。
  2. 函数式接口:只含有一个抽象方法的接口。

使用lambda表达式的条件:

  1. 使用lambda必须具有接口,并且要求接口有且仅有一个抽象方法存在。即是函数式接口。
  2. 使用lambda必须具有上下文推断。也就是方法的参数与局部变量类型必须为lambda对应的接口类型,才使用lambda作为接口的实例。

lambda表达式的演变由来举例:

按照标准格式写一个多线程的代码如下:

public class Function implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <=10 ; i++) {
            System.out.println("正在打印第"+i+"遍");
        }
    }
}
public class MyThread {
    public static void main(String[] args) {
        Function function=new Function();
        Thread thread=new Thread(function);
        thread.start();
    }
}

因为Runnable的实现类只使用一次,可以使用匿名内部类来简化代码,代码如下:

public class Mythread02 {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <=10 ; i++) {
                    System.out.println("正在打印第"+i+"遍");
                }
            }
        }).start();
    }
}

使用lambda表达式改进的代码如下:

public class MyThread03 {
    public static void main(String[] args) {
        new Thread(()->{
            for (int i = 1; i <=10 ; i++) {
                System.out.println("正在打印第"+i+"遍");
            }
        }).start();
    }
}

使用lambda表达式的省略规则:

   ()->{
        for (int i = 1; i <=10 ; i++) {
            System.out.println("正在打印第"+i+"遍");
        }
  1. 小括号内参数类型可以省略;
  2. 如果小括号内有且仅有一个参数,则小括号可以省略;
  3. 如果大括号内有且仅有一条语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。

使用自定义的函数式接口

与@Override注解作用类似,Java8中专门为函数式接口引入了一个新的注解:@FunctionalInterface。该注解可用于一个接口的定义上。一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。

lambda表达式的延迟执行(重点)

有些场景的代码执行后,结果不一定会被使用,从而造成性能上浪费,而lambda表达式是延迟执行的。正好可以作为解决方案,提升性能。(在stream流和方法引用中可以体会到延迟执行)

你可能感兴趣的:(java,新特性,lambda表达式)