• Java 8之Map新增方法<转>


    在Java 8中的Map.Entry接口中增加了comparingByKeycomparingByValue方法,它们都返回Comparator<Map.Entry<K,V>>Comparator是一个函数接口,主要是方便Lambda表达式的使用。

    在Java 8中的Map接口增加了一些default方法,提升了对key, value操作的便利性。下面是基本数据的定义,通过这些数据说明新增的一些方法。

    1
    2
    3
    4
    Map<Integer, String> map = new HashMap<>();
    map.put(1, "a");
    map.put(2, "b");
    map.put(3, "c");

    getOrDefault 方法

    如果指定的key存在,则返回该key对应的value,如果不存在,则返回指定的值。例子如下

    1
    2
    // key为4不存在,输出 d
    System.out.println(map.getOrDefault(4, "d"));

    forEach 方法

    遍历Map中的所有Entry, 对key, value进行处理, 接收参数 (K, V) -> void, 例子如下

    1
    2
    // 输出1a, 2b, 3c
    map.forEach((key, value) -> System.out.println(key + value));

    replaceAll 方法

    替换Map中所有Entry的value值,这个值由旧的key和value计算得出,接收参数 (K, V) -> V, 类似如下代码

    1
    2
    for (Map.Entry<K, V> entry : map.entrySet())
    entry.setValue(function.apply(entry.getKey(), entry.getValue()));

    例如如下:

    1
    2
    3
    map.replaceAll((key, value) -> (key + 1) + value);
    // 输出 12a 23b 34c
    map.forEach((key, value) -> System.out.println(key + value));

    putIfAbsent 方法

    如果key关联的value不存在,则关联新的value值,返回key关联的旧的值,类似如下代码

    1
    2
    3
    4
    5
    V v = map.get(key);
    if (v == null)
    v = map.put(key, value);

    return v;

    示例代码如下:

    1
    2
    3
    4
    5
    6
    map.putIfAbsent(3, "d");
    map.putIfAbsent(4, "d");
    // 输出 c
    System.out.println(map.get(3));
    // 输出 d
    System.out.println(map.get(4));

    remove 方法

    接收2个参数,key和value,如果key关联的value值与指定的value值相等(equals),则删除这个元素,类似代码如下:

    1
    2
    3
    4
    5
    if (map.containsKey(key) && Objects.equals(map.get(key), value)) {
    map.remove(key);
    return true;
    } else
    return false;

    示例代码如下:

    1
    2
    3
    4
    5
    6
    7
    map.remove(1, "b");
    // 未删除成功, 输出 a
    System.out.println(map.get(1));

    map.remove(2, "b");
    // 删除成功,输出 null
    System.out.println(map.get(2));

    replace(K key, V oldValue, V newValue) 方法

    如果key关联的值与指定的oldValue的值相等,则替换成新的newValue,类似代码如下:

    1
    2
    3
    4
    5
    if (map.containsKey(key) && Objects.equals(map.get(key), value)) {
    map.put(key, newValue);
    return true;
    } else
    return false;

    示例代码如下

    1
    2
    3
    4
    5
    6
    7
    map.replace(3, "a", "z");
    // 未替换成功,输出 c
    System.out.println(map.get(3));

    map.replace(1, "a", "z");
    // 替换成功, 输出 z
    System.out.println(map.get(1));

    replace(K key, V value) 方法

    如果map中存在key,则替换成value值,否则返回null, 类似代码如下:

    1
    2
    3
    4
    if (map.containsKey(key)) {
    return map.put(key, value);
    } else
    return null;

    示例代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 输出旧的值, a
    System.out.println(map.replace(1, "aa"));
    // 替换成功,输出新的值, aa
    System.out.println(map.get(1));

    // 不存在key为4, 输出 null
    System.out.println(map.replace(4, "d"));
    // 不存在key为4, 输出 null
    System.out.println(map.get(4));

    computeIfAbsent 方法

    如果指定的key不存在,则通过指定的K -> V计算出新的值设置为key的值,类似代码如下:

    1
    2
    3
    4
    5
    if (map.get(key) == null) {
    V newValue = mappingFunction.apply(key);
    if (newValue != null)
    map.put(key, newValue);
    }

    示例代码如下:

    1
    2
    3
    4
    5
    6
    7
    map.computeIfAbsent(1, key -> key + " computed");
    // 存在key为1,则不进行计算,输出值 a
    System.out.println(map.get(1));

    map.computeIfAbsent(4, key -> key + " computed");
    // 不存在key为4,则进行计算,输出值 4 computed
    System.out.println(map.get(4));

    computeIfPresent 方法

    如果指定的key存在,则根据旧的key和value计算新的值newValue, 如果newValue不为null,则设置key新的值为newValue, 如果newValue为null, 则删除该key的值,类似代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    if (map.get(key) != null) {
    V oldValue = map.get(key);
    V newValue = remappingFunction.apply(key, oldValue);
    if (newValue != null)
    map.put(key, newValue);
    else
    map.remove(key);
    }

    示例代码如下:

    1
    2
    3
    4
    5
    6
    7
    map.computeIfPresent(1, (key, value) -> (key + 1) + value);
    // 存在key为1, 则根据旧的key和value计算新的值,输出 2a
    System.out.println(map.get(1));

    map.computeIfPresent(2, (key, value) -> null);
    // 存在key为2, 根据旧的key和value计算得到null,删除该值,输出 null
    System.out.println(map.get(2));

    compute 方法

    compute方法是computeIfAbsentcomputeIfPresent的综合体。

    merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) 方法

    如果指定的key不存在,则设置指定的value值,否则根据key的旧的值oldvalue,value计算出新的值newValue, 如果newValue为null, 则删除该key,否则设置key的新值newValue。类似如下代码:

    1
    2
    3
    4
    5
    6
    7
    V oldValue = map.get(key);
    V newValue = (oldValue == null) ? value :
    remappingFunction.apply(oldValue, value);
    if (newValue == null)
    map.remove(key);
    else
    map.put(key, newValue);

    示例代码如下:

    1
    2
    3
    4
    5
    6
    // 存在key为1, 输出 a merge
    System.out.println(map.merge(1, " merge", (oldValue, newValue) -> oldValue + newValue));
    // 新值为null,删除key,输出 null
    System.out.println(map.merge(1, " merge", (oldValue, newValue) -> null));
    // 输出 " merge"
    System.out.println(map.merge(4, " merge", (oldValue, newValue) -> oldValue + newValue));
  • 相关阅读:
    SignalRMvc的简单例子
    CTE递归查询
    数据库表设计(邻接表、路径枚举、嵌套集、闭包表)
    EF事务
    context日志
    Context连接和断开的情况下的CRUD操作
    Sql语句拼接(EXEC和sp_executesql的区别)
    实体框架中的变更跟踪
    sql server 添加字段并且赋默认值和说明
    C# .ToString() 格式化
  • 原文地址:https://www.cnblogs.com/winkey4986/p/10957428.html
Copyright © 2020-2023  润新知