Lambda表达式

在正式了解Lambda表达式之前我们先谈谈函数式接口

简单来说,函数式接口是只包含一个方法的接口。

比如Java标准库中的java.lang.Runnable和 java.util.Comparator都是典型的函数式接口。

java 8提供 @FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断, 但 最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。

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

先用Comparator接口写个例子

打开Comparator接口的源码可以看到如下内容, 这是一个函数式接口

@FunctionalInterface
public interface Comparator<T> {

….

}

然后我们通过Lambda表达式给它添加一个实现

Comparator<String> comarator = (first,second) -> Integer.compare(first.length(), second.length());

实际上就是给Comparator接口的唯一方法 boolean equals(Object obj); 添加了行为方式

如果你仔细看,这个接口中其实还有一些 default 方法

default Comparator<T> reversed() {
        return Collections.reverseOrder(this);
 }

简单地说,就是Java接口现在可以有非抽象方法了, 个人认为这样好像破坏了java原本的一致性

import java.util.Comparator;

public class Com {

    public static void main(String[] args) {
        Comparator<String> comarator = (first,second) -> Integer.compare(first.length(), second.length());
        
        String test1 = “abc”;
        String test2 = “abc2”;
        
        System.out.println(comarator.compare(test1, test2));
        System.out.println(comarator.compare(test2, test1));
    }

}
 

下面是一个用Lambda调用多线程的例子

        Runnable runnable = () -> System.out.println(“hello world”);
        new Thread(runnable).start();