使用jdk1.8去除逻辑上重复的HashMap的value以及构建本地缓

本文介绍Java 1.8中Map接口新增的方法computeIfAbsent的应用场景及示例,通过具体代码展示了如何利用该方法高效地处理数据合并与缓存更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做一个老系统,由于表的信息不明确, 在数据库拿二个表的时候产生了笛卡尔联结,由于重复数据只有三条. 而这二个表的列数据比较固定. 所以决定取出来在后端去重。 数据类型是以List<HashMap> 进行接收的。 现在我把它合并成一条HashMap(然而后来我们没有采用这种方式, 只是记录下来突如其来的想法 ~). 测试代码如下: 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

public class Test {
	
	 public void testMergeMap(){
	        List<Map<String, String>> list = new ArrayList<>();
	        Map<String, String> m1 = new HashMap<>();
	        m1.put("fruits", "apple");
	        m1.put("others", "hahaha");
	        list.add(m1);

	        Map<String, String> m2 = new HashMap<>();
	        m2.put("fruits", "orange");
	        list.add(m2);

	        Map<String, String> m3 = new HashMap<>();
	        m3.put("fruits", "pear");
	        list.add(m3);

	        Map<String, HashSet<String>> mergeMap = new HashMap<>();
	        for(Map<String, String> map : list){
	            if(map == null){
	                continue;
	            }
	            for(Map.Entry entry : map.entrySet()){
	                mergeMap.computeIfAbsent((String)entry.getKey(), k -> genValue(k)).add((String)entry.getValue());
	            }
	        }

	        System.out.println(mergeMap.toString());
	    }

	    static HashSet<String> genValue(String str) {
	        return new HashSet<String>();
	    }  

    public static void main(String[] args) {
		 Test test= new Test();
		 
		  test.testMergeMap();
	}	

}
这里重点记录一下computeIfAbsent, 这是1.8Map接口中新增的一个方法,作者的本意是将他作为本地缓存, 在1.8的HashMap ConcurrentHashMap中都可以看到他的身影, 方法签名如下:

           public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

返回的值是你添加进去的元素的值。

此方法首先判断缓存map中是否存在指定的key值, 如果不存在会调用mappingFunction计算key的value,然后将key=value放入到缓存map中, java1.8会采用thread-safe的方式

从cache中存取记录.   1.8以前的putifAbsent也可以实现这种需求。 但是computeIfAbsent可以将一些逻辑或者限制条件写在mappingFunction里面。简单的如下:(以判断斐波那契数列为列)

import java.util.HashMap;
import java.util.Map;

public class Fibonacc {

	   static Map<Integer, Integer> cache = new HashMap<>(); 
	   
	   static int cachefibonacc(int n){
		   
		   return cache.computeIfAbsent(n, (value) -> {  
	            System.out.println("cache " + n);  
	            return cachefibonacc(n - 2) + cachefibonacc(n - 1);  
	        });  
	   }
	   
	   public static void main(String[] args) {
	        cache.put(1, 1);  
	         
		 cachefibonacc(7); 
	}
}



 





                








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值