JDK8 Map新特性compute、putIfAbsent、computeIfAbsent、computeIfPresent、merge函數用法

compute

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

對key的value進行操作, 最終 value 的值爲 lamda 表達式 remappingFunction 的執行結果

public class AnswerApp {

    public static void main(String[] args) {
        Map<String, String> map = Maps.newHashMap();

        map.put("name", "answer");
        map.put("address", "");

        System.out.println("1->" + 
			map.compute("name", 
				(k, v) -> (v == null) ? "jaemon" : v));
        System.out.println("2->" + 
			map.compute("sex", 
             	(k, v) -> (v == null) ? "man" : v));
        System.out.println("3->" + 
			map.compute("address", 
				(k, v) -> (StringUtils.isEmpty(v)) ? "sz" : v));

        System.out.println(map);
    }

}

程序運行結果

1->answer
2->man
3->sz
{address=sz, sex=man, name=answer}

 

putIfAbsent

default V putIfAbsent(K key, V value)

如果當前map中不存在 key, 則將value賦值給key, 如果 key存在, 則不進行任何操作

public class AnswerApp {

    public static void main(String[] args) {
        Map<String, String> map = Maps.newHashMap();

        map.put("name", "answer");
        map.put("address", "");

        System.out.println("1->" + map.putIfAbsent("name", "jaemon"));
        System.out.println("2->" + map.putIfAbsent("sex", "man"));
        System.out.println("3->" + map.putIfAbsent("address", "sz"));

        System.out.println(map);
    }

}

程序運行結果

1->answer
2->null
3->
{address=, sex=man, name=answer}

 

computeIfAbsent

default V computeIfAbsent(K key,
            Function<? super K, ? extends V> mappingFunction)

如果key不存在或對應的value爲null, 則使用 lamda 表達式 mappingFunction 函數的執行結果作爲value; 如果key存在,則不進行操作

public class AnswerApp {

    public static void main(String[] args) {
        Map<String, List<String>> map = Maps.newHashMap();

        map.put("names", Lists.newArrayList("kobe"));
        map.put("address", null);

        System.out.println("1->" +
                map.computeIfAbsent("names",
                        k -> Lists.newArrayList("answer")));
        // key=address對應的value爲null, 使用lamda函數的執行結果作爲value
        System.out.println("2->" +
                map.computeIfAbsent("address",
                        k -> Lists.newArrayList("sz")));
        // key=books不存在, 使用lamda函數的執行結果作爲value
        System.out.println("3->" +
                map.computeIfAbsent("books",
                        k -> Lists.newArrayList()));

        System.out.println(map);
    }

}

程序運行結果

1->[kobe]
2->[sz]
3->[]
{books=[], names=[kobe], address=[sz]}

 

computeIfPresent

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

如果key存在,則將lamda表達式 remappingFunction 的執行結果作爲value替換舊的value值; 如果key不存在或存在但對應的value爲null, 則不進行任何操作

public class AnswerApp {

    public static void main(String[] args) {
       Map<String, List<String>> map = Maps.newHashMap();

        map.put("names", Lists.newArrayList("kobe"));
        map.put("sex", null);
        map.put("books", Lists.newArrayList("java"));

        // 如果存在 key, 則將key對應的value替換爲指定的value值
        System.out.println("1->" +
                map.computeIfPresent("names",
                        (k, v) -> Lists.newArrayList("answer", "jaemon")));
        // 不存在key爲address的鍵值對, 因此下面語句不會對map哈希集有影響
        System.out.println("2->" +
                map.computeIfPresent("address",
                        (k, v) -> Lists.newArrayList("sz")));
        System.out.println("3->" +
                map.computeIfPresent("sex",
                        (k, v) -> Lists.newArrayList("man")));
        List<String> rlt = map.computeIfPresent("books", (k, v) -> {
            List<String> result = Lists.newArrayList();
            result.addAll(v);
            result.add("Spring");
            return result;
        });
        System.out.println("4->" + rlt);

        System.out.println(map);
    }

}

程序運行結果

1->[answer, jaemon]
2->null
3->null
4->[java, Spring]
{names=[answer, jaemon], books=[java, Spring], sex=null}

 

merge

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

如果key不存在, 則將value賦值給key, 否則執行 remappingFunction 函數並將函數執行結果賦值給key

public class AnswerApp {

    public static void main(String[] args) {
        Map<String, List<String>> map = Maps.newHashMap();

        map.put("names", Lists.newArrayList("kobe"));

        ArrayList<String> myNames = Lists.newArrayList("answer", "jaemon");
        // 如果 key存在, 則執行lamda表達式中的規則(參數 newVal 爲 myNames 的值)
        List<String> names = map.merge("names", myNames,
                (oldVal, newVal) -> {
                    oldVal.addAll(newVal);
                    return oldVal;
                });
        System.out.println("names=" + names);

        ArrayList<String> myBooks = Lists.newArrayList("Java", "MySQL");
        // 如果key=books不存在或對應的value爲null, 則將 myBooks 值賦值給 books
        List<String> books = map.merge("books", myBooks,
                (oldVal, newVal) -> {
                    newVal.addAll(oldVal);
                    return newVal;
                });
        System.out.println("books=" + books);

        System.out.println(map);
    }

}

程序運行結果

names=[kobe, answer, jaemon]
books=[Java, MySQL]
{books=[Java, MySQL], names=[kobe, answer, jaemon]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章