java8 lambda 详解
// @FunctionalInterface
public interface TwoArgsInterface {
void add(int left, int right);
}
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
//https://blog.youkuaiyun.com/aitangyong/article/details/54317539
//https://www.tpyyes.com/a/java/2017/0709/134.html
public class Lambda {
public static void main(String[] args) {
TwoArgsInterface twoArgs1 = (int a, int b) -> {
int c = a + b;
System.out.printf("ret is %d", c);
System.out.println();// 输出换行
};
twoArgs1.add(10, 20);
Runnable runnable1 = () -> {
System.out.println("没有参数");
};
runnable1.run();
int captureValue = 5;
Student xiaoming = new Student ();
Runnable runnable2 = () -> {
// java lambda不能修改被捕获的变量
// captureValue++;
int c = captureValue;
System.out.printf("the c value is %d", c);
System.out.println();
xiaoming.name("xiaoming");
};
xiaoming.name("xiaohua");
// captureValue++;
runnable2.run();
System.out.printf("the captureValue is %d", captureValue);
System.out.println();
Runnable runable3 = () -> System.out.println("runable three");
runable3.run();
List<Integer> list = new ArrayList<>();
list.add(0);
list.add(1);
list.add(2);
list.add(5);
list.add(4);
// 直接打印
list.forEach(System.out::println);
for (Integer element: list) {
System.out.println("element is " + element);
}
/*
lambda表达式有各种简化版本,现在我们就学习下一下常见的简化写法。
1、入参的类型是可以省略的(当然加上也没有问题),因为可以从上下文环境中推断出lambda表达式的参数类型。
TwoArgsInterface twoArgs1 = (int a, int b) -> System.out.println("no argument");
// 省略参数类型
TwoArgsInterface twoArgs2 = (a, b) -> System.out.println("no argument");
2、没有入参的时候,比如上面的Runnable接口,直接用()代表无参数。
Runnable lambdaRunnable = () -> {System.out.println("lambdaRunnable");};
3、当lambda表达式的参数个数只有一个,可以省略小括号。
// 完整语法
OneArgsInterface oneArgs1 = (int a) -> System.out.println("arguments=" + a);
// 省略参数类型
OneArgsInterface oneArgs2 = (a) -> System.out.println("arguments=" + a);
// 最简洁的写法(省略类型和括号)
OneArgsInterface oneArgs3 = a -> System.out.println("arguments=" + a);
4、当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号。
// 完整写法
Runnable runnable1 = () -> { System.out.println("lambdaRunnable"); };
// 省略大括号和结尾的分号
*/
// lambda
list.forEach((Integer i) -> System.out.println("lambda element i is " + i));
// lambda
list.forEach(i -> System.out.println("concise lambda element i is " + i));
// list.sort((a, b) -> (a > b));
// a.comparseTo(b) // java自动装箱 将int转换为Integer使用compareTo函数比较大小
// list.sort((a, b) -> a.compareTo(b)); // sort 简洁写法
// Collections.sort(list, (a, b) -> a.compareTo(b));
// java7对list进行排序
list.sort(new Comparator<Integer>(){
@Override
public int compare(Integer a, Integer b) {
return a.compareTo(b);
}
});
// java7对list进行排序
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b){
return a.compareTo(b);
}
});
list.forEach(i -> System.out.println("sort element is " + i));
}
}
本文深入探讨Java8中Lambda表达式的使用方法及优化技巧,包括接口实现、捕获变量、简化语法等,同时对比Java7的复杂写法,展示Lambda带来的代码简洁性和可读性的提升。
930

被折叠的 条评论
为什么被折叠?



