- lambda是函数式编程.很多语言中,函数(方法)是一等公民,无需依附于任何其它元素即可存在,并可以作为参数和返回值.而Java中只有类是一等公民,方法必须依附于某个类.
Java现在也支持lambda了 - 看例程: 两种方式遍历List,遍历Map
- 看例程: lambda相当于是Java通过一顿后台操作帮我们生成了一个类来实现接口,并调用我们提供的方法
- 看例程: 使用stream和collector,理解lambda的美
- 看例程: lambda可以有返回值和异常
两个静态方法
public static List<String> addElementsToList(List<String> list) {
for (int i = 0; i < 22; i++) {
list.add("str" + i);
}
return list;
}
private static void processString(String str) {
System.out.println(str);
}
普通输出集合方式
List<String> myList = addElementsToList(new ArrayList<>());
String outside = "outside string";
for (String s : myList) {
processString(outside + s);
}
匿名内部类版本
// TODO 匿名内部类版
myList.forEach(
new Consumer<String>() {
@Override
public void accept(String s) {
processString(outside + s);
}
}
);
lambda完整版
// TODO lambda的表达式必须能够符合接口中定义的抽象方法,从参数,到返回值,到异常,都必须匹配
// TODO lambda 完整版 (参数) -> {代码块}
// TODO lambda可以有返回值,使用return语句就可以,当然我们这个接口没有,我们的lambda表达式也不能有
// TODO lambda可以使用外部数据,怎么看都和匿名内部类是一样的
myList.forEach(
(s) -> {
processString(outside + s);
}
);
lambda简化版,去除了参数后大括号
// TODO lambda 单参数,代码单行 简化版,
myList.forEach(s -> processString(outside + s));
lambda终极版,如果不使用外部变量
// TODO lambda 如果不使用外部变量,还有方法引用终极简化版
myList.forEach(IterateListLambdaAppMain::processString);
lambda终极版,不是静态方法的话
// TODO lambda 方法引用终极简化版:不是静态方法,用引用也可以
IterateListLambdaAppMain inst = new IterateListLambdaAppMain();
myList.forEach(inst::processStringInst);
private void processStringInst(String str) {
System.out.println(str);
}
// TODO lambda也允许指定一个参数类型里的一个方法作为方法的引用
myList.forEach(String::toUpperCase);