java8中map新增方法详解_兴国-为梦想而战-程序员宝宝_java8 map

技术标签: java  java8中map新增方法详解  

map新增的方法:

  • getOrDefault
  • forEach
  • putIfAbsent
  • compute
  • computeIfAbsent
  • computeIfPresent
  • merge
  • remove(key,value)
  • replace
  • replaceAll

getOrDefault

default V getOrDefault(Object key, V defaultValue) {
    V v;
    return (((v = get(key)) != null) || containsKey(key))
        ? v
        : defaultValue;
}

如果Map中不存在该key,可以提供一个默认值,方法会返回改默认值。如果存在该key,返回键对应的值。

java8之前的写法:

Map<String, String> map = new HashMap<>();
String value = "D";
if(map.containsKey("d")) {
	value = map.get("d");
}

java8:

String value = map.getOrDefault("d", "D");

forEach

default void forEach(BiConsumer<? super K, ? super V> action) {
    Objects.requireNonNull(action);
    for (Map.Entry<K, V> 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,对map中的每个映射执行action指定的操作。
比如:

Map<String, String> map = new HashMap<>();
map.put("a", "A");
map.put("b", "B");

// 遍历
map.forEach((k, v)-> {
	System.out.println(k + "=" + v);
	map.put(k, k + v);
});
// 输出
// a=A
// b=B

map.forEach((k, v)-> {
	System.out.println(k + "=" + v);
});
// 输出
// a=aA
// b=bB

putIfAbsent

default V putIfAbsent(K key, V value) {
    V v = get(key);
    if (v == null) {
        v = put(key, value);
    }

    return v;
}

V putIfAbsent(K key, V value)只有在不存在key值的映射或者映射值为null,才将value值赋值给key。否则不做修改。该方法将条件判断和赋值合二为一。

比如:

Map<String, String> map = new HashMap<>();
map.put("a", "A");
map.put("b", "B");
        
String e = map.putIfAbsent("e", "E");
String b = map.putIfAbsent("b", "E");
System.out.println("返回e="+e); //返回e=null
System.out.println("键e="+map.get("e"));//键e=E
System.out.println("返回b="+b);//返回b=B
System.out.println("键b="+map.get("b"));//键b=B

remove(key,value)

default boolean remove(Object key, Object value) {
    Object curValue = get(key);
    if (!Objects.equals(curValue, value) ||
        (curValue == null && !containsKey(key))) {
        return false;
    }
    remove(key);
    return true;
}

只有在当前Map中key映射的值等于value时才删除该映射,否则什么也不做。

Map<String, String> map = new HashMap<>();
map.put("a", "A");
map.put("b", "B");

map.remove("a", "B");
map.remove("b", "B");
System.out.println(map.get("a")); // A
System.out.println(map.get("b")); // null

replace(K key, V value)

default V replace(K key, V value) {
    V curValue;
    if (((curValue = get(key)) != null) || containsKey(key)) {
        curValue = put(key, value);
    }
    return curValue;
}

只有在当前Map中包含key,才用value去替换原来的值,否则什么也不做。

Map<String, String> map = new HashMap<>();
map.put("a", "A");
map.put("b", "B");

map.replace("c", "1");
map.replace("b", "1");
System.out.println(map.get("c")); // null
System.out.println(map.get("b")); // 1

replace(K key, V oldValue, V newValue)

default boolean replace(K key, V oldValue, V newValue) {
    Object curValue = get(key);
    if (!Objects.equals(curValue, oldValue) ||
        (curValue == null && !containsKey(key))) {
        return false;
    }
    put(key, newValue);
    return true;
}

只有在当前Map中key的映射存在且映射的值等于oldValue时才用newValue去替换原来的值,否则什么也不做。

Map<String, String> map = new HashMap<>();
map.put("a", "A");
map.put("b", "B");

map.replace("a", "1", "2");
map.replace("b", "B", "2");
System.out.println(map.get("a")); // A
System.out.println(map.get("b")); // 2

replaceAll

default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
    Objects.requireNonNull(function);
    for (Map.Entry<K, V> 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);
        }

        // ise thrown from function is not a cme.
        v = function.apply(k, v);

        try {
            entry.setValue(v);
        } catch(IllegalStateException ise) {
            // this usually means the entry is no longer in the map.
            throw new ConcurrentModificationException(ise);
        }
    }
}

该方法签名为replaceAll(BiFunction<? super K,? super V,? extends V> function),作用是对Map中的每个映射执行function指定的操作,并用function的执行结果替换原来的value

比如:

Map<String, String> map = new HashMap<>();
map.put("a", "A");
map.put("b", "B");

map.replaceAll((k, v) -> v.toLowerCase());
map.forEach((k, v)-> {
	System.out.println(k + "=" + v);
});

// a=a
// b=b

merge

default V merge(K key, V value,
        BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    Objects.requireNonNull(value);
    V oldValue = get(key);
    V newValue = (oldValue == null) ? value :
               remappingFunction.apply(oldValue, value);
    if(newValue == null) {
        remove(key);
    } else {
        put(key, newValue);
    }
    return newValue;
}

value和remappingFunction不能为null
如果Map中key对应的映射不存在或者为null,则将value关联到key上;否则执行remappingFunction,如果执行结果为null则删除key的映射,否则用该结果跟key关联。

比如:

Map<String, String> map = new HashMap<>();
map.put("e", "E");
map.merge("f", "F", String::concat);
map.merge("e", "F", String::concat);
System.out.println("map.get(\"f\")="+map.get("f")); // map.get("f")=F
System.out.println("map.get(\"e\")="+map.get("e")); // map.get("e")=EF
		

compute

default V compute(K key,
        BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    // 获取key对应的值
    V oldValue = get(key);

    //获取新值
    V newValue = remappingFunction.apply(key, oldValue);
    // 如果新值为null,并且key存在,则删除key;否则把新值赋值给key
    if (newValue == null) {
        // delete mapping
        if (oldValue != null || containsKey(key)) {
            // something to remove
            remove(key);
            return null;
        } else {
            // nothing to do. Leave things as they were.
            return null;
        }
    } else {
        // add or replace old mapping
        put(key, newValue);
        return newValue;
    }
}

比如:

Map<String, String> map = new HashMap<>();
map.put("b", "B");
String val = map.compute("b", (k, v) -> null); 
String val2 = map.compute("c", (k, v) -> v + "+v");
System.out.println(val); // null
System.out.println(val2); // null+v

computeIfAbsent

 default V computeIfAbsent(K key,
            Function<? super K, ? extends V> mappingFunction) {
    Objects.requireNonNull(mappingFunction);
    V v;
    if ((v = get(key)) == null) {
        V newValue;
        if ((newValue = mappingFunction.apply(key)) != null) {
            put(key, newValue);
            return newValue;
        }
    }

    return v;
}

当Map中不存在key值的映射或映射值为null时,调用mappingFunction,并在mappingFunction执行结果非null时,将结果赋值给key。

比如(输入每个字母的位置):

List<String> list = Lists.newArrayList("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g");
Map<String, List<Integer>> positionsMap = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
    positionsMap.computeIfAbsent(list.get(i), k -> Lists.newArrayListWithCapacity(1)).add(i);
}

System.out.println(positionsMap);
// {a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9, 10], g=[11]}

相关链接:

java8中map新增方法详解
java8中Stream的使用
java8中Collection新增方法详解
java8中Collectors的方法使用实例
java8中常用函数式接口
java8中的方法引用和构造函数引用
java8中的Collectors.groupingBy用法
java8中的Optional用法
java8中的日期和时间API

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

智能推荐

Gym - 102222G Factories (树形DP)_YOONGI的博客-程序员宝宝

FactoriesByteland hasnncities numbered from11tonn, andn−1n−1bi-directional roads connecting them. For each pair of cities, the residents can arrive one from another one through these roads...

Java orb_hnhbdss的博客-程序员宝宝

Contact UsTerms of UseHomeConsultingEducationProductsArticlesCareersHome   Purchase TAO Documentation   Product Information   Downloads & Links   Support      FAQ      Training    

ABP入门系列——使用ABP集成的邮件系统发送邮件_聖傑的博客-程序员宝宝

ABP中对邮件的封装主要集成在Abp.Net.Mail和Abp.Net.Mail.Smtp命名空间下,相应源码在此。#一、Abp集成的邮件模块是如何实现的分析可以看出主要由以下几个核心类组成:EmailSettingNames:静态常量类,主要定义了发送邮件需要的相关参数:Port、Host、UserName、Password、Domain、EnableSsl、UseDefaultCre

计算机课翻译成英语怎么说,计算机专业课程名英文翻译.doc_weixin_39624360的博客-程序员宝宝

计算机专业课程名英文翻译计算机专业课程名称英文翻译(计算机科学与技术(教师教育)专业的课程名称和英文名称)4?????? 中国现代史纲要????????????? Outline of Moderm Chinese History5?????? 大学英语??????????????????? College English6?????? 大学体育??????????????????? Colleg...

java---生产者与消费者的例子_yinhua405的博客-程序员宝宝

public class Test1 {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubtest(); }public static void test() throws Exception{Store s = new Sto

kettle工具原理_FlizhN的博客-程序员宝宝_kettle原理

kettle基础介绍kettle,ETL工具的一种,现在kettle改名了,叫Pentaho Data Integration(PDI),但更多时候大家还是习惯用之前的名字kettle。Kettle是一款国外开源的ETL工具,纯java编写(依赖jdk),可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。Kettle中有两种脚本文件,transformation(.ktr)和job(.kjb)transformation:完成针对数据的基础转换 job:则完成

随便推点

Admin - SpringBoot集成Kaptcha验证码_空山新雨⁣的博客-程序员宝宝

SpringBoot集成Kaptcha验证码一:依赖&lt;dependency&gt; &lt;groupId&gt;com.github.penggle&lt;/groupId&gt; &lt;artifactId&gt;kaptcha&lt;/artifactId&gt; &lt;version&gt;2.3.2&lt;/version&gt;&lt;/dependency&gt;二:Kaptcha实体属性类(注入Bean使用)包名:net.i.xiangadmi

汽车电子测试小知识(3)——什么是PiL测试?_Polelink北汇信息的博客-程序员宝宝_pil测试

处理器在环测试(Processor-in-the-Loop testing,即PiL测试)是指对处理器上的嵌入式软件进行测试和验证,这些软件之后将被用于电子控制单元(ECU)。其算法和函数通常是在PC上的开发环境中直接用C、C++或基于模型开发的。例如,可以是一个Simulink、TargetLink、ASCET或ASCET- developer模型。生成的C/ C++代码必须在用于处理器的特殊“目标”编译器中进行编译,编译之后将用于车辆的ECU。PiL测试用于检查编译后的代码是否也能在目标处理器上工作.

阿里云python中文社区_python 写中文_weixin_39905624的博客-程序员宝宝

字符串你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:```python#!/usr/bin/env python# -*- coding: utf-8 -*-第一...文章bayesianyy2016-04-15559浏览量Python相关文章合集(玉树芝兰)这一段陆续写...

上述博客中的程序均存在bug,尤其是链表类的程序中,需要在其中添加排序函数!_蒙昧的自己的博客-程序员宝宝

templatevoid doubleList::Sort(){ vectortemp; LinkNode* p = head; while (p) { temp.push_back(p->data); p = p->link; } p = head; sort(temp.begin(), temp.end()); for (int i = 0;

CF16E Fish(状压+期望dp)_weixin_30409849的博客-程序员宝宝

[传送门[(https://www.luogu.org/problemnew/show/CF16E)解题思路  比较简单的状压+期望。设\(f[S]\)表示\(S\)这个状态的期望,转移时挑两条活着的鱼打架。时间复杂度\(O(2^n*n^2)\)。代码#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;cstring&gt...

C3P0连接池及其工具类的使用_纵死侠骨香的博客-程序员宝宝

准备工作:1.导包2.配置c3p0-config.properties文件3.数据库准备二、正式开始1.使用成c3p0连接池对数据库进行查询package com.henu.c3p0;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import j...

推荐文章

热门文章

相关标签