java 8新特性(一)lambda表达式
java 8新特性(一)lambda表达式
一、lambda 表达式
public static List<Employee> employees = Arrays.asList(
new Employee("张三",18,1111.00),
new Employee("李四",28,2222.00),
new Employee("王五",38,3333.00),
new Employee("赵六",48,4444.00),
new Employee("候七",58,5555.00)
);
public static List<Employee> filterEmployee3(List<Employee> list,
FilterEmployee<Employee> fe){
List<Employee> emps = new ArrayList<>();
for (Employee e: list){
if(fe.compare(e)) {
emps.add(e);
}
}
return emps;
}
采用内部类实现
System.out.println("采用内部类实现接口......................");
List<Employee> emps5 = filterEmployee3(employees, new FilterEmployee<Employee>() {
@Override
public boolean compare(Employee employee) {
return employee.getAge() >35;
}
});
emps5.forEach(System.out::println);
结果:
采用内部类实现接口......................
Employee{name='王五', age=38, salary=3333.0}
Employee{name='赵六', age=48, salary=4444.0}
Employee{name='候七', age=58, salary=5555.0}
采用lambda表达式
System.out.println("采用lambda表达式");
List<Employee> emps6 = filterEmployee3(employees,(e) -> e.getAge() <= 35 );
emps6.forEach(System.out::println);
二、 语法
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
三、变量作用域
lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
需求:先按照年龄,年龄相同 再按照姓名比
public static List<Employee> employees = Arrays.asList(
new Employee("张三",18,1111.00),
new Employee("李四",58,2222.00),
new Employee("王五",38,3333.00),
new Employee("赵六",48,4444.00),
new Employee("候七",58,5555.00)
);
// 需求:先按照年龄,年龄相同 再按照姓名比
public static void main(String[] args){
System.out.println("Integer.compare(x.getAge(),y.getAge() = "+ Integer.compare(11,3));
//
Collections.sort(employees,(x,y)->{
if(x.getAge() == y.getAge()){
return x.getName().compareTo(y.getName());
} else {
// Integer.compare(x,y) x>y ==> 1 x==y ==> 0 x<y ==> -1
return Integer.compare(x.getAge(),y.getAge());
}
});
employees.forEach(System.out::println);
System.out.println("--------------------------------------------------------------");
}