JAVA8新特性
一、Lambda表达式
Lambda规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。
jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用
注解@FunctionalInterface
修饰函数式接口,要求接口中的抽象方法只有一个。一般会与Lambda表达式一起出现。
语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符 ,读作(goes to)。
1.2 Lambda表达式常用示例
-
Lambda表达式引用方法
有时候我们不是必须要自己重写某个匿名内部类的方法,我们可以可以利用 lambda表达式的接口快速指向一个已经被实现的方法。
语法:
方法归属者::方法名
静态方法的归属者为类名,普通方法归属者为对象
-
构造方法
-
创建线程
-
遍历集合
-
排序
1.3 参考资料
参考链接:https://www.cnblogs.com/haixiang/p/11029639.html
二、Stream流
https://blog.youkuaiyun.com/weixin_38294999/article/details/89277697
三、实例
3.1 需求1:List里面的元素,以某个属性来分组成Map<Object, List。
例如,以id分组,将id相同的放在一起:
代码:
public class Test{
public static void main(String[] args){
List<Apple> list = new ArrayList<>();
Apple apple = new Apple(1,"苹果1",new BigDecimal(3.25),10);
Apple apple2 = new Apple(2,"苹果2",new BigDecimal(3.35),10);
Apple apple3 = new Apple(1,"苹果3",new BigDecimal(3.25),15);
list.add(apple);
list.add(apple2);
list.add(apple3);
// 按照id进行分组
Map<Integer, List<Apple>> listMap = list.stream().collect(Collectors.groupingBy(Apple::getId));
System.out.println(listMap);
}
}
3.2 List转为Map<Object,Object>
将List里面的实体类
/**
* List -> Map
* 需要注意的是:
* toMap 如果集合对象有重复的key,会报错Duplicate key ....
* apple1,apple12的id都为1。
* 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
*/
Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));
3.3 过滤List,找出符合要求的对象并转为list
从集合中过滤出来符合条件的元素:
//过滤出符合条件的数据
List<Apple> filterList = appleList.stream().filter(a -> a.getName().equals("香蕉")).collect(Collectors.toList());
System.err.println("filterList:"+filterList);
[Apple{id=2, name='香蕉', money=2.89, num=30}]
3.4 过滤list, 返回任何一个符合要求的对象,如果为null,则返回自定义的
Apple apple = appleList.stream().filter(a -> a.getName().equals("香蕉")).findAny().orElse(null);
3.5 如果找到符合要求的对象,对该对象的某个属性进行修改
ifPresent 用于对过滤出的数据如果存在。如果经过过滤条件后,有数据的话就可以进行修改。
appleList.stream().filter(a -> a.getName().equals("香蕉")).findAny().ifPresent(a->a.setName("苹果"));
3.6 将一个元素转换为List
对象bean : Apple apple = new Apple();
List list = Stream.of(apple).collect(Collectors.toList());