背景
有一产品类,包含id,产品编号,产品金额。在代码中采用map方式去存储该产品,map的key是从数据库中查询出来的每一个产品的序号,value则是一个一个的map类型,问:如何筛选这个map使得代码简介好看?
解决方法
可以使用Steam流的方式遍历map 【若不明白Stream流】可以参考这个博主写的一系列关于Stream流的文章
【Java 8系列】Stream详解,看这一篇就够啦
文章地址
代码实战
产品类:
/**
* @author: 代码丰
* @Date: 2022/8/4 17:54
* @Description: 产品类
*/
@Data
public class Product {
/**
* urid
*/
int id;
/**
* 模拟产品编号
*/
BigDecimal code;
/**
* 模拟产品金额
*/
BigDecimal amount;
}
需要筛选的map集合:
/**
* @author: 代码丰
* @Date: 2022/8/4 17:54
* @Description:
*/
public class productFilterTest {
public static void main(String[] args) {
Map<Integer, Map<String, String>> targertMap = new HashMap<>();
Map<String, String> list1 = new HashMap<>();
list1.put("id", "1");
list1.put("amount", "10");
list1.put("code", "aaaa");
Map<String, String> list2 = new HashMap<>();
list2.put("id", "2");
list2.put("amount", "20");
list2.put("code", "bbbb");
Map<String, String> list3 = new HashMap<>();
list3.put("id", "3");
list3.put("amount", "30");
list3.put("code", "aaaa");
targertMap.put(0, list1);
targertMap.put(1, list2);
targertMap.put(2, list3);
String code = "aaaa";
//问题:筛选出来所有的单据号码为aaaa的单据 并且保留正确的顺序
Map<Integer, Map<String, String>> listAfterFilter = targertMap
//将map的entry变成Stream流中流动的元素
.entrySet().stream()
//筛选出来code = aaaa的元素
.filter(entry -> entry.getValue().get("code").equals(code))
//将Stream 变为 map保留原始的格式
.collect(Collectors.toMap(s -> s.getKey(), s -> s.getValue()));
System.out.println(listAfterFilter);
}
结果分析:
可以看到,aaaa的编号的map被全部包里欧,并且正确保留了元素序号