JAVA8 Lambda表达式及匿名内部类

Lambda

Lambda表达式支持将代码块作为方法参数, 允许使用更简洁的代码来创建只有一个抽象方法的接口的实例.
Lambda的三部分:
>形参列表.形参列表允许省略形参类型, 如果形参列表中只有一个参数, 甚至连形参列表的圆括号都可以省略
>箭头(->), 必须通过英文中画线和大于符号组成
>代码块,如果代码块中只包含一条语句,Lambda表达式允许省略代码块的花括号. 那么这条语句就不要用花括号表示语句结束.

Lambda表达式和匿名内部类主要存在以下区别:

>匿名内部类可以为任意接口创建实例---不管接口包含多少抽象方法, 只要匿名内部类实现所有的抽象方法即可:但Lambda表达式只能为函数式接口创建实例.
>匿名颞部类可以为抽象类甚至普通的类创建实例, 但Lambda表达式只能为函数式接口创建实例.
>匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认犯法, 但Lambda表达式的代码块不允许调用接口中定义默认方法.

匿名内部类

//https://www.cnblogs.com/wuhenzhidu/p/anonymous.html
创建匿名内部类的会立即创建一个该类的实例, 这个类定义立即消失, 匿名内部类不能重复使用.
new 实现接口() | 父类构造器(实参列表)
{
//匿名内部类的雷替部分.
}
两条规则:
>匿名内部类不能是抽象类, 因为系统在创建匿名内部类时, 会立即创建匿名内部类的对象, 因此不允许将匿名颞部类定义成抽象类.
>匿名内部类不能定义构造器, 由于匿名内部类没有类名, 所以无法定义构造器, 但匿名内部类可以定义初始化块, 可以通过实例初始化块来完成构造器需要完成的事情.
>当创建匿名内部类是, 必须实现接口或抽象父类里所有的抽象方法, 如果有需要也可以重写父类中的普通方法,

Lambda举例

遍历
//Lambda表达式
orderList.forEach(order -> {
System.out.println(order);
});

过滤
//Lambda表达式
orderList.stream().filter(order -> order.getSaleAmount() > 500)
.collect(Collectors.toList());

去重
//Lambda表达式
idList.stream().distinct().collect(Collectors.toList());

求总数, 最大值, 最小值, 平均数
//Lambda表达式
// 求和
orderList.stream().mapToDouble(Order::getSaleAmount).sum();
//最大
orderList.stream().mapToDouble(Order::getSaleAmount).max();
//最小
orderList.stream().mapToDouble(Order::getSaleAmount).min();
//平均值
orderList.stream().mapToDouble(Order::getSaleAmount).average();

分组
//Lambda表达式
Map<String, List> orderMap = orderList.stream().collect(Collectors.groupingBy(Order::getCategory));

分组求和
//Lambda表达式
Map<String, Integer> orderMap = orderList.stream().collect(Collectors.groupingBy(Order::getCategory,Collectors.summingInt(Order:: getSaleAmount)))

排序
//Lambda表达式
orderList.sort((order1, order2) -> order1.getSaleTime().compareTo(order2.getSaleTime()));

猜你喜欢

转载自blog.csdn.net/yuyixiong/article/details/107760312