一、前言
二、Lambda表达式语法
2.1
语法
(paramaters) -> expression (paramaters) -> {expression;}
2.2
特征
2.3
例子
public int addition(int a, int b) {return a + b;} //lambda表达式写法1 (int a, int b) -> a + b //lambda表达式写法2 (int a, int b) -> { return a + b; } //lambda表达式写法3 (自动推断参数类型) (a, b) -> a + b;
(参数列表) -> { 表达式; }
2.4
Lambda的类型
2.4.1
λ表达式返回值类型是的目标类型,目标类型是"函数接口(functional interface)"
函数接口
:一个只含有显式声明的 抽象方法
的接口。
public interface Runnable {void run();} public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }
2.4.2
用Lambda表达式赋值
//(1) Runnable r1 = () -> { System.out.println("Lambda!");}; Object obj = r1; //(2)错误例子 Object obj = () -> {System.out.println("Lambda!");}; //错误:对象不是函数接口! //(3)必须显式的转型成一个函数接口才可以 Object obj = (Runnable)()->System.out.println("Lambda!");};
System.out.println( () -> {} ); //错误! 目标类型不明 System.out.println( (Runnable)() -> {} ); // 正确
@FunctionalInterface public interface MyFuntionInterface { public void doSomething(); } Runnable r1 = ()->{System.out.println("Runnbale");}; MyFuntionInterface m2 = ()->{System.out.println("MyFI");}
三、Lambda表达式的用处
(1)、
用于替换以前广泛使用的内部匿名类
内部匿名类写法
Thread t1 = new Thread (new Runnable(){
@Override public void run() { System.out.println("匿名内部类写法"); }
});
Thread t2 = new Thread ( ()->{ System.out.println("Lambda表达式写法"); } );
(2)、
λ表达式与集合类批处理操作(或者叫块操作)
集合类的迭代分为
List<String> list = new ArrayList<>() {"AA", "BB", "CC"};
外部迭代:由客户代码进行迭代
for(Object o : list) { // 外部迭代 System.out.println(o); }
内部迭代:由Java类库来进行迭代
list.forEach( o -> {System.out.println(o);});
forEach
方法接受一个函数接口Consumer做参数,故可以使用λ表达式 (3)未完......