美文网首页
日拱一卒:Lambda 之 Map 操作

日拱一卒:Lambda 之 Map 操作

作者: Tinyspot | 来源:发表于2023-10-10 20:05 被阅读0次

1. Map

public interface Map<K,V> {
    default V computeIfAbsent(K key,
            Function<? super K, ? extends V> mappingFunction)

    default V computeIfPresent(K key,
            BiFunction<? super K, ? super V, ? extends V> remappingFunction)
}

2. computeIfAbsent()

@Test
public void computeIfAbsent() {
    Map<String, String> map = new HashMap<>();
    map.put("key1", "100");
    map.put("key2", "200");
    map.put("key3", "300");
    System.out.println("HashMap:\n " + map);

    // key3 存在,不执行 mappingFunction
    map.computeIfAbsent("key3", key -> "301");
    map.computeIfAbsent("key4", key -> "401");
    System.out.println("HashMap:\n " + map);
}

打印结果

HashMap:
 {key1=100, key2=200, key3=300}
HashMap:
 {key1=100, key2=200, key3=300, key4=401}

2.2 示例2

@Test
public void computeIfAbsent2() {
    Map<String, List<String>> map = new HashMap<>();
    map.put("key1", Lists.newArrayList("100", "101"));
    map.put("key2", Lists.newArrayList("200"));
    map.put("key3", Lists.newArrayList("300"));
    System.out.println("HashMap:\n " + map);

    map.computeIfAbsent("key3", key -> Lists.newArrayList("301"));
    System.out.println("HashMap:\n " + map);

    map.computeIfAbsent("key3", key -> Lists.newArrayList("301")).add("302");
    System.out.println("HashMap:\n " + map);
}

打印结果

HashMap:
 {key1=[100, 101], key2=[200], key3=[300]}
HashMap:
 {key1=[100, 101], key2=[200], key3=[300]}
HashMap:
 {key1=[100, 101], key2=[200], key3=[300, 302]}

2.3 示例3

@Test
public void computeIfAbsent3() {
    Map<String, List<String>> map = new HashMap<>();
    map.put("key1", Lists.newArrayList("100", "101"));
    map.put("key2", Lists.newArrayList("200"));
    map.put("key3", Lists.newArrayList("300"));
    System.out.println("HashMap:\n " + map);

    // key -> new ArrayList<>() 作用是指定默认值
    map.computeIfAbsent("key3", key -> new ArrayList<>()).add("301");
    map.computeIfAbsent("key4", key -> new ArrayList<>()).add("401");
    System.out.println("HashMap:\n " + map);
}

打印结果

HashMap:
 {key1=[100, 101], key2=[200], key3=[300]}
HashMap:
 {key1=[100, 101], key2=[200], key3=[300, 301], key4=[401]}

3. computeIfPresent()

/**
 * computeIfAbsent(K key, Function mappingFunction)
 *  若map中无对应的key,则执行lambda表达式生成一个默认值并放入map中并返回,否则返回map中已有的值
 *
 * computeIfPresent(K key, BiFunction remappingFunction)
 *  若map中存在对应的key,则对其value执行lambda表达式生成一个新值并放入map中并返回,否则返回null
 */
@Test
public void demo() {
    Map<String, String> map = new HashMap<>();
    map.put("key1", "100");
    map.put("key2", "200");
    map.put("key3", "300");
    System.out.println("HashMap:\n " + map);

    String absentValue = map.computeIfAbsent("key3", key -> "301");
    System.out.println("absentValue: " + absentValue + "\n HashMap:\n " + map);

    String presentValue = map.computeIfPresent("key3", (key, value) -> "301");
    System.out.println("presentValue:" + presentValue + "\n HashMap:\n " + map);

    String presentValue2 = map.computeIfPresent("key4", (key, value) -> "401");
    System.out.println("presentValue2:" + presentValue2 + "\n HashMap:\n " + map);
}

4. List 放入 Map

@Test
public void defaultMap() {
    List<OrderDTO> orders = Lists.newArrayList(new OrderDTO("A1001", "1001", 1),
            new OrderDTO("A1002", "1002", 1), new OrderDTO("A1002", "1003", 1));

    Map<String, List<OrderDTO>> orderByCodeMap = new HashMap<>();
    for (OrderDTO order : orders) {
        orderByCodeMap.computeIfAbsent(order.getOrderCode(), key -> new ArrayList<>()).add(order);
    }
    System.out.println(orderByCodeMap);
}

方式二:通过自定义一个有默认值的 DefaultHashMap 来实现

@Test
public void defaultMap() {
    List<OrderDTO> orders = Lists.newArrayList(new OrderDTO("A1001", "1001", 1),
            new OrderDTO("A1002", "1002", 1), new OrderDTO("A1002", "1003", 1));

    Map<String, List<OrderDTO>> orderMap = new DefaultHashMap<>(ArrayList::new);
    for (OrderDTO order : orders) {
        orderMap.get(order.getOrderCode()).add(order);
    }
    // 相同的 orderCode 会合并到一个List<OrderDTO>
    System.out.println(orderMap);
}
public class DefaultHashMap<K, V> extends HashMap<K, V> {
    Function<K, V> function;

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

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

相关文章

  • 日拱一卒英语社群复盘ing

    相 信 我,你 并 不 孤 独。 日拱一卒启动仪式1-4合集 日拱一卒”英语社群入群作业 日拱一卒启动仪式1-4合...

  • 日拱一卒

    日拱一卒是一个成语,完整的表述是:日拱一卒,功不唐捐。源于《法华经》 :“日拱一卒无尽有,功不唐捐终入海”。 会下...

  • 2017-10-11

    持之以恒,日拱一卒。

  • 2017-10-11

    持之以恒,日拱一卒。

  • 今晚,信仰

    如题,日拱一卒

  • 感觉要重新开始写作了

    按兴趣日拱一卒

  • 坚持还是放弃?取舍之间彰显大智慧。

    今天看到一段话,感觉写的更好,分享给大家。“日拱一卒”源于《法华经》:日拱一卒,功不唐捐——日拱一卒无有尽,功不唐...

  • 2021-04-25

    冰冻三尺,非一日之寒。 日拱一卒,功不唐捐。

  • 日拱一卒

    日拱一卒 任务0(12月11日) 最近刚加入这个“日拱一卒”的社群,名字非常好,学英文就...

  • 无题

    日拱一卒,功不唐捐。

网友评论

      本文标题:日拱一卒:Lambda 之 Map 操作

      本文链接:https://www.haomeiwen.com/subject/wdzwbdtx.html