Stream流实践(一):Stream流的方式遍历map,筛选数据

背景

有一产品类,包含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被全部包里欧,并且正确保留了元素序号

经验分享 程序员 微信小程序 职场和发展