Erlo

Java8中那些方便又实用的Map函数

2022-11-13 17:00:17 发布   41 浏览  
页面报错/反馈
收藏 点赞

原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。

简介

java8之后,常用的Map接口中添加了一些非常实用的函数,可以大大简化一些特定场景的代码编写,提升代码可读性,一起来看看吧。

computeIfAbsent函数

比如,很多时候我们需要对数据进行分组,变成Map>的形式,在java8之前,一般如下实现:

List payments = getPayments();
Map> paymentByTypeMap = new HashMap();
for(Payment payment : payments){
    if(!paymentByTypeMap.containsKey(payment.getPayTypeId())){
        paymentByTypeMap.put(payment.getPayTypeId(), new ArrayList());
    }
    paymentByTypeMap.get(payment.getPayTypeId())
            .add(payment);
}

可以发现仅仅做一个分组操作,代码却需要考虑得比较细致,在Map中无相应值时需要先塞一个空List进去。

但如果使用java8提供的computeIfAbsent方法,代码则会简化很多,如下:

List payments = getPayments();
Map> paymentByTypeMap = new HashMap();
for(Payment payment : payments){
    paymentByTypeMap.computeIfAbsent(payment.getPayTypeId(), k -> new ArrayList())
            .add(payment);
}

computeIfAbsent方法的逻辑是,如果map中没有(Absent)相应的key,则执行lambda表达式生成一个默认值并放入map中并返回,否则返回map中已有的值。

带默认值Map
由于这种需要默认值的Map太常用了,我一般会封装一个工具类出来使用,如下:

public class DefaultHashMap extends HashMap {
    Function function;

    public DefaultHashMap(Supplier supplier) {
        this.function = k -> supplier.get();
    }

    @Override
    @SuppressWarnings("unchecked")
    public V get(Object key) {
        return super.computeIfAbsent((K) key, this.function);
    }
}

然后再这么使用,如下:

List payments = getPayments();
Map> paymentByTypeMap = new DefaultHashMap(ArrayList::new);
for(Payment payment : payments){
    paymentByTypeMap.get(payment.getPayTypeId())
            .add(payment);
}

呵呵,这玩得有点像python的defaultdict(list)

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认