java8:函数式Map操作
1.介绍
list、map的转换变形,业务代码中经常遇到,传统模式需要写一堆代码for循环一个个逻辑判断,麻烦且易出bug。下面看下java8的函数式代码。
package com.base3;
import java.math.BigDecimal;
import java.math.BigInteger;
public class Fruit {
private String name;
private BigDecimal price;
private BigInteger number;
private int total;
private double RealPrice;
public Fruit(String name, BigDecimal price, BigInteger number, int total, double realPrice) {
this.name = name;
this.price = price;
this.number = number;
this.total = total;
RealPrice = realPrice;
}
@Override
public String toString() {
return "Fruit{" +
"name='" + name + '\'' +
", price=" + price +
", number=" + number +
", total=" + total +
", RealPrice=" + RealPrice +
'}';
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getName() {
return name;
}
public BigDecimal getPrice() {
return price;
}
public BigInteger getNumber() {
return number;
}
public int getTotal() {
return total;
}
public double getRealPrice() {
return RealPrice;
}
}
tips: https://search.maven.org/ 可以查看库的各个版本,比如fastjson
在maven项目的pom.xml中引入该库(包):
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
</dependencies>
安装完即可使用fastjson:
由路径可知,导入com.alibaba.fastjson.JSON即可
testng下包含Lists,可以使用Lists.newArrayList,依赖如下:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>compile</scope>
</dependency>
2 list转map
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.testng.collections.Lists;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSON;
List<Fruit> fr= Lists.newArrayList(
new Fruit("apple",new BigDecimal("2"),new BigInteger("15"),40,1.23),
new Fruit("watermelon",new BigDecimal("4"),new BigInteger("5"),10,0.6),
new Fruit("peach",new BigDecimal("2"),new BigInteger("5"),20,1.8),
new Fruit("pear",new BigDecimal("4"),new BigInteger("15"),15,3.2),
new Fruit("banana",new BigDecimal("3"),new BigInteger("15"),24,2)
);
//list转map
Map<String,Fruit> m=Optional.ofNullable(fr).orElse(Collections.emptyList())
.stream().collect(Collectors.toMap(Fruit::getName,x->x));
System.out.println(JSON.toJSONString(m, SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat));
{
"banana":{
"name":"banana",
"number":15,
"price":3,
"realPrice":2.0,
"total":24
},
"apple":{
"name":"apple",
"number":15,
"price":2,
"realPrice":1.23,
"total":40
},
"pear":{
"name":"pear",
"number":15,
"price":4,
"realPrice":3.2,
"total":15
},
"peach":{
"name":"peach",
"number":5,
"price":2,
"realPrice":1.8,
"total":20
},
"watermelon":{
"name":"watermelon",
"number":5,
"price":4,
"realPrice":0.6,
"total":10
}
}
2.1 key,value格式
Map<String,BigDecimal> m=Optional.ofNullable(fr).orElse(Collections.emptyList())
.stream().collect(Collectors.toMap(Fruit::getName,Fruit::getPrice));
System.out.println(JSON.toJSONString(m, SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat));
{
"banana":3,
"apple":2,
"pear":4,
"peach":2,
"watermelon":4
}
toMap在含重复key时会抛错duplicate key,可如下处理:
Map<BigInteger,BigDecimal> m=Optional.ofNullable(fr).orElse(Collections.emptyList())
.stream().collect(Collectors.toMap(Fruit::getNumber,Fruit::getPrice,(key1,key2)->key1));
System.out.println(JSON.toJSONString(m, SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat));
{5:4,15:2
}
2.2 list转map然后分组
根据BigInteger的编号对水果进行分组:
Map<BigInteger,List<Fruit>> m=Optional.ofNullable(fr).orElse(Collections.emptyList())
.stream().collect(Collectors.groupingBy(Fruit::getNumber));
System.out.println(JSON.toJSONString(m,SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue));
{5:[
{
"name":"watermelon",
"number":5,
"price":4,
"realPrice":0.6,
"total":10
},
{
"name":"peach",
"number":5,
"price":2,
"realPrice":1.8,
"total":20
}
],15:[
{
"name":"apple",
"number":15,
"price":2,
"realPrice":1.23,
"total":40
},
{
"name":"pear",
"number":15,
"price":4,
"realPrice":3.2,
"total":15
},
{
"name":"banana",
"number":15,
"price":3,
"realPrice":2.0,
"total":24
}
]
}