欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java 8 引入lambda表达式的原因解析

程序员文章站 2023-11-24 21:16:22
在java8出现之前,如果你想传递一段代码到另一个方法里是很不方便的。你几乎不可能将代码块到处传递,因为java是一个面向对象的语言,因此你要构建一个属于某个类的对象,由它...

在java8出现之前,如果你想传递一段代码到另一个方法里是很不方便的。你几乎不可能将代码块到处传递,因为java是一个面向对象的语言,因此你要构建一个属于某个类的对象,由它的某个方法来放置你想传递的代码块。

下面看两个非常典型的例子,构造线程与比较器:

构造线程:

我们要想在另一个线程中执行一些代码逻辑时,通常会将代码放在一个实现runnable接口的run方法当中,如下图:

public static void main(string[] args) {
  mythread t = new mythread();

}
class mythread implements runnable {
  @override
  public void run() {
    system.out.println("放入你想执行的代码");
  }
}

你写这段代码的目的就是想开启新的线程来执行你定制的代码,为此你创建了mythread。

接着我们看下构造比较器:

public static void main(string[] args) {
  list<integer> list = new arraylist<>();
  list.add(2);
  list.add(5);
  list.add(1);
  list.add(4);
  list.add(3);
  comparator<integer> comparator = new comparator<integer>() {
    @override
    public int compare(integer o1, integer o2) {
      return o2 - o1;
    }
  };
  collections.sort(list, comparator);
}

sort 方法会不断调用compare 方法,对顺序不对的元素进行重新排序,直到有序为止。你写比较器的目的就是给collections的sort方法传递一段比较逻辑的代码片段,这段代码会被整合到排序排序逻辑中,为此你写了一个类和一个方法。

上述两个例子你会看到它们的相似点,将一段代码传递给其他调用者(一个线程池或者一个排序方法),这段代码会在新的方法中被调用。

但是,在java8出现之前,如果你想传递一段代码到另一个方法里是很不方便的,因为java是一个面向对象的语言,因此你要构建一个属于某个类的对象,由它的某个方法来放置你想传递的代码块。而在一些其他语言中可以直接传递代码块,比如js。为此,java决定加入了lambda表达式的语法糖。

lambda改造

对于传入比较器代码块,我们的目的是想传入一段比较逻辑,利用lambda表达式可以:

lambda表达式的语法格式是:参数->一个表达式,如果想传入的代码无法用一个表达式表示,则可以用 参数->{多个表达式}。如果没有参数需要传递,则可以用()->表达式的形式。

public static void main(string[] args) {

    list<integer> list = new arraylist<>();
    list.add(2);
    list.add(5);
    list.add(1);
    list.add(4);
    list.add(3);

    collections.sort(list, (one,two)->{
      system.out.println("one="+one);
      system.out.println("two="+two);
      return two - one;
    });
  }

编译器会解析出来 one 与 two 是原先接口compare方法的入参,并自动赋予integer类型。

对于构造线程,我们的目的就是想传入一段线程执行的代码,利用lambda表达式可以这样做:

public static void main(string[] args) {
  new thread(() -> {
    for (int i = 0; i < 100; i++) {
      system.out.println("这是一个线程" + i);
    }
  }).start();
  for (int i = 100; i < 200; i++) {
    system.out.println("这是主线程" + i);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。