写一个屏幕打印字符的Demo:
public class Lambda {
interface Printer{
void printer(String str);
}
public void printSth(String sth, Printer printer){
printer.printer(sth);
}
public static void main(String[] args){
Lambda lambda = new Lambda();
String sth = "These words will be printed on the screen";
/*--------常规写法---------*/
Printer printer = new Printer() {
@Override
public void printer(String str) {
System.out.println(str);
}
};
lambda.printSth(sth, printer);
/*----Lambda-------*/
/*
* 根据以上常规写法,对比Lambda写法,得出:
* 1. 接口实现的时候,覆盖方法直接写成匿名方法,写在赋值符号右边
* 2. 匿名方法的形参要和覆盖的方法一致
* 3. 实现的方法体通过箭头符号和大括号表明
* 4. 实现类中,去掉了覆盖方法的@Override注释以及权限标识
**/
Printer printer1 = (String str)->{
System.out.println(str);
};
lambda.printSth(sth, printer1);
/*-----Lambda 简化写法1-----------*/
/*
* 去掉匿名方法形参的参数类型
* Lambda 会自动匹配参数类型
**/
Printer printer2 = (str)->{
System.out.println(str);
};
lambda.printSth(sth, printer2);
/*-----Lambda 简化写法2-----------*/
/*
* 如果匿名方法体只有一行,可以省略大括号
**/
Printer printer3 = str -> System.out.println(str);
lambda.printSth(sth, printer3);
/*-----Lambda 简化写法3-----------*/
/*
* 表达式直接作为参数
* Lambda 的参数以及返回值都可以省略
* 更据接口的定义,选择不同的写法
**/
lambda.printSth(sth, str -> System.out.println(str));
/*
* 如果接口方法没有参数,匿名参数列表的小括号不能省略,写法如下:
* () -> System.out,print();
**/
}
}
实在记不住,按照上面的demo依葫芦画瓢。一个接口,接口有个未实现的方法。
下面给出一个处理流的应用
import static java.util.stream.Collectors.toList;
List names = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur");
List list = names.stream() //将数组转化为流
.filter(s->s.startsWith("L")) //筛选出L开头的字母
.map(String::toUpperCase) // 将字符串转化为大写
.sorted() //按照字母自然顺序排序
.collect(toList()); //转化为数组
System.out.println(list); // [LEMUR, LION]