Java8 的各种骚操作(List->Map、过滤、类型转
2018-12-17 本文已影响10人
Cocoonshu粽子
前言
自从项目引入Java8,就想用一些骚气的语法糖,故总结一下~方便日后查找
数据结构准备
public class Item {
private Long id;
private String name;
private Double score;
private BigDecimal bigDecimal;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
public BigDecimal getBigDecimal() {
return bigDecimal;
}
public void setBigDecimal(BigDecimal bigDecimal) {
this.bigDecimal = bigDecimal;
}
}
/**
* init List
* @return
*/
private List<Item> initList(){
List<Item> itemList = new ArrayList<>();
for (int i=0;i<10;i++){
Item item = new Item();
item.setId((long) i);
item.setName("Test"+i);
item.setScore(Math.random());
item.setBigDecimal(new BigDecimal(Math.random()));
itemList.add(item);
}
return itemList;
}
List 转Map
/**
* * List -> Map
* * 需要注意的是:
* * toMap 如果集合对象有重复的key,会报错Duplicate key ....
* * apple1,apple12的id都为1。
* * 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
*/
private void listToMap(){
List<Item> itemList = initList();
Map<Long,Item> itemMap = itemList.parallelStream().collect(Collectors.toMap(Item::getId, item -> item,(k1, k2)->k1));
}
过滤
/**
* 从集合中过滤出来符合条件的元素:
*/
private void filter(){
List<Item> itemList = initList();
List<Item> itemFilter =itemList.parallelStream().filter(item -> item.getId()!=null).filter(item -> item.getId()>0).collect(Collectors.toList());
}
类型转换
/**
* 类型转换
*/
private void typeConversion(){
List<String> stringList = new ArrayList<>();
List<Long> longList = stringList.parallelStream().map(Long::valueOf).collect(Collectors.toList());
}
分组
/**
* 分组
*/
private void groupingBy(){
List<Item> itemList = initList();
Map<Long,List<Item>> itemMap = itemList.parallelStream().collect(Collectors.groupingBy(Item::getId));
}
求和
/**
* 属性求和
*/
private void sum(){
List<Item> itemList = initList();
BigDecimal totalBigDecimal = itemList.parallelStream().map(Item::getBigDecimal).reduce(BigDecimal.ZERO,BigDecimal::add);
itemList.parallelStream().mapToDouble(Item::getScore).sum();
}