JDK 1.8 新特性之Lambda表达式 函数式接口 Lambda特点总结 示例

在说Lambda表达式之前,先介绍一下函数式接口

就是只定义了一个抽象方法的接口,我们可以使用注解@Functionallnterface,来强约束这种接口为函数式接口。如Runnable、Callable、Comparator等接口。

Java内置的四大函数式接口:Consumer<T>,Supplier<T>,Function<T,R>,Predicate<T>。
Lambda表达式就是专门用来实现这些函数式接口的表达式。

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

以Runnbale线程为例

Runnable runnable = new Runnable()
{
      @Override
       public void run()
       {
          System.out.println("hello lambda!");
       }
};
new Thread(runnable).start();

用Lambda表达式则可修改为:

Runnable runnable = ()->{   
    System.out.println("hello lambda!");
}; 
new Thread(runnable).start();

其中参数列表:与接口中方法的参数列表要求一致。

Lambda特点总结

  • 参数列表中的参数类型可以直接都忽略掉不写。(注意是参数类型,不是参数。因为因为JVM编译器通过上下文推断出数据类型)
  • 如果只有一个参数,圆括号也可以省略
  • 方法体如果只有一语句,可以省略掉大括号
  • 如果仅有一条语句,并且他是return语句的话,那么可以直接省略掉return关键字

示例

语法一:无参数,且无返回值类型

public void test() {
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
        System.out.println("Hello Lambda!");        
        }
    };
    runnable.run();
}
/**
 *  () -> System.out.println("Hello Lambda!");
 */public void test() {
// "->" 左边只有一个小括号,表示无参数,右边是Lambda体(相当于实现了匿名内部类里面的方法了,即一个可用的接口实现类了)
Runnable runnable = ()->System.out.println("Hello Lambda!");    
runnable.run();
}

语法二:一个参数,且无返回值类型

/**
*  (x) -> System.out.println(x)
*/
public void test() {
  //这个e就代表所实现的接口的方法的参数
  Consumer<String> consumer = (e)->System.out.println("Hello"+e);
  consumer.accept("Lambda");
}
/**
*  x -> System.out.println(x)
* 一个参数的话“()”可以省略
*/ public void test() {   //这个e就代表所实现的接口的方法的参数   Consumer<String> consumer = e->System.out.println("Hello"+e);   consumer.accept("Lamdba"); }

语法三:两个以上的参数,且有返回值,且 Lambda 体中有多条语句

public void test4() {
  //Lambda 体中有多条语句,要用大括号括起来
  Comparator<Integer> com = (x, y) -> {
    System.out.println("函数式接口");
    return Integer.compare(x, y);
  };
  int compare = com.compare(100, 244);
  System.out.println(compare);
}