一、前言
二、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)未完......