栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java进阶营】Java进阶篇(4)— JDK8新增的Map方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java进阶营】Java进阶篇(4)— JDK8新增的Map方法

JDK8最大的新特性便是增加反应式流编程。作为最常用的数据结构Map。它有什么变化呢?我们能不能更加方便的使用呢?

在JDK8中Map的一些方法可以使用Lambda表达式了。而Lambda表达式是就是匿名内部类的简写。实际上可以理解为Map的参数可以是一段代码了。即行为参数化 。

1. 什么叫做行为参数化

以Map的遍历为例:

匿名内部类的调用方式:

    @Test
    public void testMap() {
        Map map = new HashMap<>();
        map.forEach(new BiConsumer() {
            @Override
            public void accept(String key, String value) {
                System.out.println(key+":"+value);
            }
        });
    }

Lambda表达式的调用方式:

    @Test
    public void testMap() {
        Map map = new HashMap<>();
        map.forEach((key,value)-> System.out.println(key+":"+value));
    }

源码:java.util.Map#forEach

    default void forEach(BiConsumer action) {
        Objects.requireNonNull(action);
        //遍历Map,获取key和value
        for (Map.Entry entry : entrySet()) {
            K k;
            V v;
            try {
                k = entry.getKey();
                v = entry.getValue();
            } catch(IllegalStateException ise) {
                // this usually means the entry is no longer in the map.
                throw new ConcurrentModificationException(ise);
            }
            //根据传入的不同对象,执行不同的业务方法。
            action.accept(k, v);
        }
    }

foreach()方法的参数是一个对象。我们传入不同的对象,该方法有不同的处理逻辑。
实际上我们传入的是一个策略对象。

Map的新特性,其实便是策略模式的一种运用,需要注意的是,当使用Lambda表达式作为参数简写匿名内部类,实际上传入的依旧是对象。匿名内部类逻辑,将在调用方法某处执行。

[详解——策略设计模式]

策略模式属于对象的行为模式,其用意是定义一族算法,把他们封装起来(称为策略),在运算的时候选择一种策略。
策略模式的重心不在于如何实现算法,而是如何组织,调用这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

2. Map常用方法

Map在项目中一般作为缓存使用,使用比较多的方法有遍历方法、put方法或get方法。

我们一般的操作缓存:若Map中存在,我们直接返回用户,若map不存在,则先将其加入到缓存中,在返回。若下列代码所示:

    public Cache getCache(String name) {
        Cache cache = this.cacheMap.get(name);
        if (cache != null) {
            return cache;
        }
        else {
            // Fully synchronize now for missing cache creation...
            synchronized (this.cacheMap) {
                cache = this.cacheMap.get(name);
                if (cache == null) {
                    cache = getMissingCache(name);
                    if (cache != null) {
                        cache = decorateCache(cache);
                        this.cacheMap.put(name, cache);
                        updateCacheNames(name);
                    }
                }
                return cache;
            }
        }
    }

在JDK8的Map中,有没有好的方式去实现上述功能?

  1. 遍历方法
    @Test
    public void testMap() {
        Map map = new HashMap<>();
        map.forEach((key,value)-> System.out.println(key+":"+value));
    }

  1. 【获取并存储】putIfAbsent (如果不存在时进行存储,但返回null)

若映射存在,返回value;若映射不存在,存储value返回null。

使用方式:

    @Test
    public void testMap() {
        Map map = new HashMap<>();
        String v1 = map.putIfAbsent("aa", "v1");
        String v2 = map.putIfAbsent("aa", "v2");
        System.out.println("key不存在时,返回的值:" + v1);
        System.out.println("key存在时,返回的值:" + v2);
        System.out.println("此时,key的映射:" + map.get("aa"));
    }

返回结果

key不存在时,返回的值:null
key存在时,返回的值:v1
此时,key的映射:v1

  1. 【获取并存储】computeIfAbsent:(如果不存在时进行存储,返回存储的值)

可以看到,匿名内部类的参数实际上是Key的值。

    @Test
    public void testMap() {
        Map map = new ConcurrentHashMap<>();
        String v1 = map.computeIfAbsent("aa", K->K+"v1");
        String v2 = map.computeIfAbsent("aa", K->K+"v2");
        System.out.println("key不存在时,返回的值:" + v1);
        System.out.println("key存在时,返回的值:" + v2);
        System.out.println("此时,key的映射:" + map.get("aa"));
    }

返回结果:

key不存在时,返回的值:aav1
key存在时,返回的值:aav1
此时,key的映射:aav1

  1. 获取value(若key存在,对key和value操作得到newValue,替换原值)
    @Test
    public void testMap() {
        Map map = new HashMap<>();
        map.computeIfPresent("aa", (k,v)->getValue(k,v));
    }

  1. 获取value(若key不存在,返回默认值)
    @Test
    public void testMap() {
        Map map = new HashMap<>();
        map.getOrDefault("aa",new String("bb"));
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/851631.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号