Lambda 表達式的基礎語法 : Java8 中引入了一個新的操作符 “->
“, 該操作符稱爲箭頭操作符或 Lambda 操作符,箭頭操作符將 Lambda 表達式拆分成兩部分 :
左側 : Lambda 表達式的參數列表;
右側 : Lambda 表達式中所需執行的功能, 即 Lambda 體;
基本語法:
(parameters) ->
expression
或
(parameters) ->
{ statements; }
常用示例:
1.forEach遍歷List集合
String[] names = {"喵","汪","咩"};
List<String> nameList = Arrays.asList(names);
// 舊的循環方式
for (String name : nameList) {
System.out.print(name + "; ");
}
// 使用 lambda 表達式
nameList.forEach((item) -> System.out.print(item + " "));
2.Stream用法
(1).filter過濾
List<User> users = users.stream()
.filter(user -> "小喵咪".equals(user.getName()))
.collect(Collectors.toList());
(2).map處理
List nums = Arrays.asList(100, 200, 300, 400, 500);
for (Integer num : nums) {
num = num + 12;
System.out.println(num);
}
// 使用 lambda 表達式
List nums = Arrays.asList(100, 200, 300, 400, 500);
nums.stream().map((num) -> num = num + 12)
.forEach(System.out::println);
3.使用Lambda排序集合
String[] names = {"喵","汪","咩"};
// 使用匿名內部類排序
Arrays.sort(names, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s1.compareTo(s2));
}
});
// 使用lambda表達式
Arrays.sort(names, (String s1, String s2) -> (s1.compareTo(s2)));
4.返回不同類型的處理結果
//返回String
String str = userList.stream()
.filter(user -> "喵".equals(user.getName()))
.collect(joining(";"));
//返回Set
Set<String> names = userList.stream()
.filter(user -> "喵".equals(user.getName()))
.collect(toSet());
//返回TreeSet
TreeSet<String> names = userList.stream()
.filter(user -> "喵".equals(user.getName()))
.collect(toCollection(TreeSet::new));
5.實現多線程接口
//使用Thread匿名內部類
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello world!");
}
}).start();
//使用lambda表達式
new Thread(() -> System.out.println("Hello world!")).start();
//使用Runnable匿名內部類
Runnable race1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello world!");
}
};
//使用lambda表達式
Runnable race2 = () -> System.out.println("Hello world!");
注意事項:
1.lambda 表達式的局部變量可以不用聲明爲 final,但是必須不可被後面的代碼修改(即隱性的具有 final 的語義);
2.在 Lambda 表達式當中不允許聲明一個與局部變量同名的參數或者局部變量。