java8中Map的10个常用新方法_鱿鱼的博客-程序员宝宝_java8 map

技术标签: java  java8  map  

package com.jandmin.demo;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiFunction;

/**
 * @Description:  java8中的map新方法
 * @Author: JandMin
 */
public class MainTest {
    public static void main(String[] args) {
        //map 新特性
        Map<Integer,String> map = new HashMap<Integer,String>();
        for(int i=0; i<6; i++){
            map.put(i,"val_"+i);
        }
        map.put(10,null);

        //1:遍历
        map.forEach((key,value) -> System.out.println(key+":"+value));

        //2:V getOrDefault(key,defaultValue):获取key值,如果key不存在则用defaultValue
        System.out.println("3-->"+map.getOrDefault(3,"val_66"));//3-->val_3
        System.out.println("10-->"+map.getOrDefault(10,"val_66"));//10-->null
        System.out.println("11-->"+map.getOrDefault(11,"val_66"));//11-->val_66

        //3:V putIfAbsent(K key, V value):根据key匹配Node,如果匹配不到则增加key-value,返回null,如果匹配到Node,如果oldValue不等于null则不进行value覆盖,返回oldValue
        System.out.println(map.putIfAbsent(3,"val_66"));//val_3
        System.out.println(map.putIfAbsent(10,"val_66"));//null
        System.out.println(map.putIfAbsent(11,"val_66"));//null
        System.out.println(map.get(3)+"--"+map.get(10)+"--"+map.get(11));//val_3--val_66--val_66

        //4:boolean remove(Object key, Object value):根据key匹配node,如果value也相同则删除
        System.out.println(map.size());//8
        map.remove(10,"66");
        map.remove(11,"val_66");
        System.out.println(map.size());//7
        System.out.println(map.toString());//{0=val_0, 1=val_1, 2=val_2, 3=val_3, 4=val_4, 5=val_5, 10=val_66}

        //5:boolean replace(K key, V oldValue, V newValue):根据key匹配node,如果value也相同则使用newValue覆盖返回true,否则返回false
        map.put(11,null);
        map.replace(3,"3","33");
        map.replace(10,"val_66","val_666666");
        map.replace(11,null,"val_11");
        map.replace(11,null,"val_11");
        System.out.println(map.toString());//{0=val_0, 1=val_1, 2=val_2, 3=val_3, 4=val_4, 5=val_5, 10=val_666666, 11=val_11}
        /** 6:
         * void replaceAll(BiFunction function):调用此方法时重写BiFunction的Object apply(Object o, Object o2)方法,
         * 其中o为key,o2为value,根据重写方法逻辑进行重新赋值。
         */
        map.replaceAll((key,value) -> {
            if(key == 2){
                return value+"222";
            }
            return value;
        });
        System.out.println(map.toString());//{0=val_0, 1=val_1, 2=val_2222, 3=val_3, 4=val_4, 5=val_5, 10=val_666666, 11=val_11}
        /** 7:
         * V compute(K key,BiFunction remappingFunction):根据key做匹配,根据BiFunction的apply返回做存储的value。
         * 匹配到Node做value替换,匹配不到新增node。apply的返回值如果为null则删除该节点,否则即为要存储的value。
         */
        System.out.println("---------------------- compute -----------------------");
        System.out.println(map.compute(3,new BiFunction() {
            @Override
            public Object apply(Object key, Object value) {
                return key+":"+value;
            }
        }));//3:val_3 -》用返回值覆盖原来的值,这里用了java7的编码方式,以下均采用java8的lanbda表达式
        System.out.println(map.compute(10,(key,value) -> {return value.split("_")[1];}));//666666 -》用返回值覆盖原来的值
        System.out.println(map.compute(6,(key,value) ->  null));//null -》返回值为null,则删除该key值
        System.out.println(map.toString());//{0=val_0, 1=val_1, 2=val_2, 3=3:val_3, 4=val_4, 5=val_5, 10=666666, 11=val_11}
        /** 8:
         * merge(K key, V value,BiFunctionsuper V, ? super V, ? extends V> remappingFunction):
         * 功能大部分与compute相同,不同之处在于BiFunction中apply的参数,入参为oldValue、value,
         * 调用merge时根据两个value进行逻辑处理并返回value。
         */
        System.out.println(map.merge(3,"val_3",(value,newValue) -> newValue));//val_3  --》返回值覆盖原来的value
        System.out.println(map.merge(10,"33334",(a,b) -> (Integer.valueOf(a)+Integer.valueOf(b))+""));//700000
        System.out.println(map.merge(8,"88",(oldValue,newValue) -> oldValue+newValue));//88 -》key不存在则新增
        System.out.println(map.merge(11,"11",(old,newValue) -> null));//null -》返回值为null,删除该节点
        System.out.println(map.toString());//{0=val_0, 1=val_1, 2=val_2, 3=val_3, 4=val_4, 5=val_5, 8=88, 10=700000}
        /** 9:
         * computeIfAbsent(K key,Functionsuper K, ? extends V> mappingFunction):
         * 根据key做匹配Node,(匹配不到则新建然后重排)
         * 如果Node有value,则直接返回oldValue,
         * 如果没有value则根据Function接口的apply方法获取value,返回value。
         * Function接口的apply的入参为key,调用computeIfAbsent时重写Function接口可以根据key进行逻辑处理,
         * apply的返回值即为要存储的value。
         */
        System.out.println("----------------------computeIfAbsent------------------------");
        map.put(8,null);
        System.out.println(map.toString());//{0=val_0, 1=val_1, 2=val_2, 3=val_3, 4=val_4, 5=val_5, 8=null, 10=700000}
        System.out.println(map.computeIfAbsent(0,key -> key+"000"));//val_0  -》key值存在,直接返回oldValue
        System.out.println(map.computeIfAbsent(7,key -> "value_"+key));//value_7 -》key匹配不到,直接新增,返回值为value
        System.out.println(map.computeIfAbsent(8,key -> "88"));//88 -》key匹配到了,value为null,返回值作为value
        System.out.println(map.toString());//{0=val_0, 1=val_1, 2=val_2, 3=val_3, 4=val_4, 5=val_5, 7=value_7, 8=88, 10=700000}
        /** 10:
         * V computeIfPresent(K key,BiFunction remappingFunction):
         * 根据key做匹配,如果匹配不上则返回null,匹配上根据BiFunction的apply方法获取value,返回value。
         * BiFunction接口的apply的入参为key、oldValue,调用computeIfPresent时重写Function接口
         * 可以根据key和oldValue进行逻辑处理,apply的返回值如果为null则删除该节点,否则即为要存储的value。
         */
        map.remove(7);
        map.remove(8);
        map.replace(10,null);
        map.remove(0,"val_0");//value匹配到了删除
        map.remove(1,"val_0");//value匹配失败,不会删除
        System.out.println(map.toString());//{1=val_1, 2=val_2, 3=val_3, 4=val_4, 5=val_5, 10=null}
        System.out.println(map.computeIfPresent(3,(key,value) -> key+":"+value));//3:val_3 -》key存在,根据返回值修改value
        System.out.println(map.computeIfPresent(0,(key, value) -> "0000"));//null -》key不存在,返回null,不做任何操作
        System.out.println(map.computeIfPresent(1,(key, value) -> null));//null -》key存在,根据返回值修改value
        System.out.println(map.computeIfPresent(10,(key,value) -> "val_10"));//null -》oldValue值为null,删除节点
        System.out.println(map.toString());//{2=val_2, 3=3:val_3, 4=val_4, 5=val_5, 10=null}
        /** 比较
         * compute:根据key做匹配,key,value为参数,匹配到Node做value替换,匹配不到新增node。apply的返回值为null则删除该节点。
         * merge:oldValue,newValue作为为参数,其它功能于compute类似
         * computeIfAbsent:根据key匹配,参数为key,存在且value不为null,不做修改,为null用返回值作为value,不存在则新增
         * computeIfPresent:key,value作为参数,存在,原来的值为null不做操作,否则返回值作为新的value覆盖原来;不存在,不做操作;返回值为null删除该节点
         *
         */
  }
}

原文:https://blog.csdn.net/ItRuler/article/details/81002264

computeIfAbsent

存在且value不为null,则返回value
不满足上述条件下,先检查Function返回值,若为null,返回null
存在但value为null,则将Function返回值作为value,返回value
不存在,新建节点,将Function返回值作为value,返回value

使用场景:从map中获取所需要的value,若其为null,就用准备好的值即Function的返回值
原做法:

Map<Integer, List<String>> map = new HashMap<>();
map.put(1, new ArrayList<>(Arrays.asList("1","2","3")));
System.out.println(map);
List<String> strings = map.get(1);
 if (strings == null){
     strings = new ArrayList<>();
 }
 strings.add("4");
 System.out.println(map);

输出:

{1=[1, 2, 3]}
{1=[1, 2, 3, 4]}

修改后做法:

Map<Integer, List<String>> map = new HashMap<>();
map.put(1, new ArrayList<>(Arrays.asList("1","2","3")));
System.out.println(map);
map.computeIfAbsent(1, e -> new ArrayList<>()).add("4");
System.out.println(map);

computeIfPresent

存在且value不为null:1,BiFunction返回值为null,删除该节点;2,BiFunction返回值不为null,作为新value,返回其值
不存在或其value为null,返回null

使用场景:更新map中存在的且其value值不为null的键值对的值

原文:https://blog.csdn.net/sinat_34976604/article/details/82055250

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30831935/article/details/92785856

智能推荐

史上最全数据集网站汇总_BrainEditor的博客-程序员宝宝_哪里有数据集

如果你是一个初学者,你每完成一个新项目后自身能力都会有极大的提高,如果你是一个有经验的数据科学专家,你已经知道这里所蕴含的价值。&nbsp;本文将为您提供一个网站/资源列表,从中你可以使用数据来完成你自己的数据项目,甚至创造你自己的产品。一.如何使用这些资源?如何使用这些数据源是没有限制的,应用和使用只受...

PAT甲级1075 PAT Judge (25 分)_世界第一可爱ɞ的博客-程序员宝宝

1075 PAT Judge (25 分)The ranklist of PAT is generated from the status list, which shows the scores of the submissions. This time you are supposed to generate the ranklist for PAT.Input Specification:Each input file contains one test case. For each ca

JavaScript之DOM的三大事件及事件模型(转)_tigerrui的博客-程序员宝宝

DOM的三大事件:1.鼠标事件2.键盘事件3.HTML事件1.鼠标事件click:单击 dblclick:双击mousedown:按下鼠标 mousepress:按下到松开鼠标的过程mouseup:松开鼠标mouseove:鼠标移到什么上 mouseout:鼠标从哪移开mousemove:移动鼠标mouseenter:鼠标进入 mouseleave:鼠标离开&lt;bo...

Java中Map初始化,增删查改,遍历,全网最详细的博客!!!_皓烨的博客-程序员宝宝_java 初始化键值对

文章目录MapMap的 一些特点HashMapLinkedHashMapMap集合的遍历键找值:通过元素中的键,获取键所对应的值键值对:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。MapMap的 一些特点1.Collection 中的集合称为单列集合, Map 中的集合称为双列集合。2.Map 中的集合,元素是成对存在的,每个元素由键与值两部分组成,键-&gt;值。Map集合的子类 : HashMap集合、LinkedHashMap集合。HashMap存储

10g的客户端从9i的服务器中导出数据时遇到上面的问题_weixin_34183910的博客-程序员宝宝

EXP-00056: 遇到 ORACLE 错误 6550ORA-06550: 第 1 行, 第 41 列:PLS-00302: 必须说明 'SET_NO_OUTLINES' 组件ORA-06550: 第 1 行, 第 15 列:PL/SQL: Statement ignoredEXP-00000: 导出终止失败今天用10g的客户端从9i的服务器中...

随便推点

Java的内存结构_枸杞加上的博客-程序员宝宝_java内存结构

Java中的内存结构在说明他们在内存中如何存储之前,先要对内存中的存储区域进行讲解。存储数据的地方有:1、寄存器(程序计数器Program Counter Register)在CPU内部,是最快的存储区。在字节码解释器工作时,就是通过改变程序计数器的值来选取下一条要执行的指令,分支、循环、跳转、等基础功能都是依赖此技术区完成的。在java多线程方面,多线程就是通过线程轮流切换而...

SQLServer批量插入数据的两种方法_weixin_30732487的博客-程序员宝宝

在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题。下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters)。运行下面的脚本,建立测试数据库和表值参数。--Create DataBase create da...

AR/VR/MR,Android开发者可以做些什么?_weixin_34235105的博客-程序员宝宝

文| 谷歌开发技术专家 (GDE) 杨波 (Alpha)随着 ASUS 在 CES2017 上宣布了全球第一款同时具有 Tango 和 Daydream 两种能力的 ZenFone AR,终于使得 AR/VR/MR 这些近来全球开发圈内超级热门的词汇可以让我们国内的 Android 开发者直接利用手中的 Android Studio 和方便入手的 Android 设备来进行虚拟开发的探索了!1. ...

WinSock网络编程_lovelyccc的博客-程序员宝宝

 正在处理您的请求...WinSock网络编程实用宝典 转自:http://blog.csdn.net/Liu_Qiang/archive/2006/01/19/583662.aspx 一、TCP/IP 体系结构与特点   1、TCP/IP体系结构   TCP/IP协议实际上就是在物理网上的一组完整的网络协议

自定义view之kotlin绘制精简小米时间控件_villa_mou的博客-程序员宝宝

今天玩小米手机的时候看到了小米的时间控件效果真的很棒,但是要完全写出来估计以我现在的能力肯定是不够的 而且也没有那么多时间来研究 那就写个简易版的吧 先来看看小米的效果 再来看看我的效果 小米这个控件是有3d效果和手势效果的,当然我没有偶这些,太麻烦,而且我也不熟 看到这个控件的时候先理一下自己的思路 1,先画最外层的圆弧和文字 2,再画里面刻度盘 3,再画秒表三角形

java使用okhttp库实现Authorization认证请求_weixin_34114823的博客-程序员宝宝

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...