LAMBDA表达式(实用篇)
Apple类定义:
//对象类Apple定义
class Apple{
private String name;
private double price;
}
List相关的转换
//存储了苹果对象的List
List<Apple> appleList;
List<对象> 提取某个属性,放入新的List/Set
//提取对象属性,存入List
List<String> appleNameList = appleList.stream()
.map(Apple::getName)
.collect(Collectors.toList());
//提取对象属性,存入Set
Set<String> appleNameSet = appleList.stream()
.map(Apple::getName)
.collect(Collectors.toSet());
List<对象> 生成按属性分类的Map
Map<Integer, List<Apple>> groupByPriceMap = appleList.stream().collect(Collectors.groupingBy(Apple::getPrice));
List<对象> 生成(属性1 -> 属性2)的映射Map
Map<String, Double> nameToPriceMap = appleList.stream()
.collect(Collectors.toMap(Apple::getName, Apple::getPrice));
}
List<对象> 生成(属性1 -> 对象)的映射Map
Map<String, Apple> nameToAppleMap = appleList.stream().collect(Collectors.toMap(Apple::getName, apple -> apple, (k1,k2)->k1));
这个方法不太好理解
源码的注释里这个Collectors.toMap()方法的三个参数大概意思是:
(生成map的key, 生成map的value,如果发生冲突的处理方式)
对应到这里就是:
(当前对象的name,当前对象本身,如果两个放入的元素冲突,取第一个)
再举个例子,与上面不同的是,这里在转换过程中构造一个新的类:
类定义:
class Peach{
private String name;
Peach(String name){
this.name = name;
}
}
接下来开始转换:
Map<String, Apple> nameToAppleMap = appleList.stream().collect(Collectors.toMap(Apple::getName, apple -> new Peach(apple.getName()), (k1,k2)->k1));