Lambda表达式
先有匿名内部类,匿名内部类是对仅有一个方法的接口(函数式接口)一种便捷的实现方式,Lambda表达式则是对这种便捷的实现方式的进一步简化,这里不介绍匿名内部类,可自行搜索
实现一个接口
- 接口:
//接口:
public interface Swimming{
void swim();
}
- 一般实现 必须新建一个实现类:
public class SwimmingImpl implements Swimming {
@Override
public void swim() {
System.out.println("Swimming using implementation class.");
}
}
开发中更多采用这种方式,因为实现类后可以在任意位置调用,同时更便于维护
- 匿名内部类实现:
Swimming swimming = new Swimming() {
@Override
public void swim() {
System.out.println("Swimming using anonymous inner class.");
}
};
- Lambda表达式实现:
Swimming swimming = ()
-> System.out.println("Swimming using lambda expression.");
其实还可以化简,但笔者认为这样更美观
当一个方法的参数为一个函数式接口时
- 接口:
public interface IntToDoubleFunction {
/**
* Applies this function to the given argument.
*
* @param value the function argument
* @return the function result
*/
double applyAsDouble(int value);
}
- 方法
Arrays.setAll(prices, new IntToDoubleFunction())
- 匿名内部类方式:
Arrays.setAll(prices, new IntToDoubleFunction()) {
@Override
public double applyAsDouble(int value) {
// value = 0 1 2
return prices[value] * 0.8;
}
});
- Lambda表达式的改写:
Arrays.setAll(prices, (int value) -> {
return prices[value] * 0.8;
};
- 例2:
//在来一个改写:
//匿名内部类:
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return Double.compare(o1.getHeight(), o2.getHeight()); // 升序
}
});
//对数组中的元素按照年龄升序排列: 改用Lambda写法
Arrays.sort(students, (Student o1, Student o2) -> {
return Double.compare(o1.getHeight(), o2.getHeight()); // 升序
});