一、lambda表达式

一、lambda概念

  • java8 它可让咱们用简洁流畅的代码完成一个功能。java

  • 很长一段时间java被吐槽是冗余和缺少函数式编程能力的语言,随着函数式编程的流行java8种也引入了 这种编程风格。程序员

在此以前咱们都在写匿名内部类干这些事,但有时候这不是好的作法,本文中将介绍和使用lambda, 带你体验函数式编程的魔力express

lambda表达式是一段能够传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为编程

咱们回顾一下在使用java8以前要作的事,以前咱们编写一个线程时是这样的:ide

Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("do something.");      
    }
}

也有人会写一个类去实现Runnable接口,这样作没有问题,咱们注意这个接口中只有一个run方法, 当把Runnable对象给Thread对象做为构造参数时建立一个线程,运行后将输出do something.。 咱们使用匿名内部类的方式实现了该方法函数式编程

这其实是一个代码即数据的例子,在run方法中是线程要执行的一个任务,但上面的代码中任务内容已经被规定死了。 当咱们有多个不一样的任务时,须要重复编写如上代码函数

设计匿名内部类的目的,就是为了方便 Java 程序员将代码做为数据传递。不过,匿名内部 类仍是不够简便。 为了执行一个简单的任务逻辑,不得不加上 6 行冗繁的样板代码。那若是是lambda该怎么作?学习

Runnable r = () -> System.out.println("do something.");

嗯,这代码看起来很酷,你能够看到咱们用()和->的方式完成了这件事,这是一个没有名字的函数,也没有人和参数,再简单不过了。 使用->将参数和实现逻辑分离,当运行这个线程的时候执行的是->以后的代码片断,且编译器帮助咱们作了类型推导; 这个代码片断能够是用{}包含的一段逻辑。下面一块儿来学习一下lambda的语法。线程

二、lambda基本语法

2.一、基本概念

expression = (variable) -> action
  • variable: 这里是一个变量,一个占位符,像x,y,z,能够是多个变量,也就是说左侧是lambda表达式的参数列表
  • action: 这里我称它为action(也就是表达式中所需执行的功能), 这是咱们实现的代码逻辑部分,它能够是一行代码也能够是一个代码片断
  • 能够看到Javalambda表达式的格式:参数、箭头、以及动做实现,当一个动做实现没法用一行代码完成,能够编写 一段代码用{}包裹起来
  • lambda表达式能够包含多个参数
int sum = (x, y) -> x + y;

这时候咱们应该思考这段代码不是以前的xy数字相加,而是建立了一个函数,用来计算两个操做数的和。 后面用int类型进行接收,在lambda中为咱们省略去了return设计

2.二、语法格式

  • 语法格式一:无参数,无返回值
Runnable runnable1 = () -> System.out.println("lambda表达式");
  • 语法格式二:有一个参数,无返回值
// Consumer 接口能够查看源码
 Consumer<String> consumer = (x)-> System.out.println(x);
 consumer.accept("有参数的lambda表达式");
  • 语法格式三:若只有一个参数,小括号能够不写省略
Consumer<String> consumer = x-> System.out.println(x);
        consumer.accept("有参数的lambda表达式");
  • 语法格式四:有两个参数以及以上参数,有返回值,方法体多条语句
Comparator<Integer> comparator1 = (x, y) -> {
            System.out.println(x + y);
            return Integer.compare(x,y);
        };
  • 语法格式五:若是lambda体中只有一条语句,return和大括号均可以省略不写
Comparator<Integer> comparator1 = (x, y) -> Integer.compare(x, y);
  • 语法格式六: Lambda表达式的参数列表的数据类型能够省略不写,由于JVM编译器经过上下问推断出数据类型---类型推断
Comparator<Integer> comparator1 = (x, y) -> Integer.compare(x, y);

三、Lambda表达式例子

以下的代码咱们仔细阅读

  • 函数型接口
@FunctionalInterface
public interface MyFunction<T> {

    public Integer getValue(Integer num);

}

上面的代码,咱们定义了一个函数型的接口,该接口存在一个抽象方法,该方法的具体实现由咱们本身实现

  • 调用
public class TestLambda02 {

    public static void main(String[] args) {
        Integer value = operation(100, x -> x * 2);
        System.out.println(value);
    }
    public static Integer operation(Integer num, MyFunction mf) {

        return mf.getValue(num);
    }
}

上面代码中,对于函数型接口MyFunction,咱们采用了自定义实现x->x*2,由此能够发现lambda表达式就是一段能够传递的代码

相关文章
相关标签/搜索