Java8爲集合新增方法總結

衆所周知,在Java中,集合類分爲兩種:單列集合Collection和鍵值對集合Map。我想只要是個玩Java的,怎麼操作這些集合應該都是手到擒來。但是,在Java8中出現了Lambda表達式,因此對這些集合的操作又有了新的API。我這裏簡單總結一下,供大家參考。

Iterable新增forEach方法

Iterable屬於Collection的父接口,因此凡是屬於Collection的子類,都可以使用該方法進行元素遍歷。

示例代碼如下所示:

public class TestList {

    public static void main(String[] args) {

       List<String> list = new ArrayList<>();
       list.add("Tom");
       list.add("Jerry");
       list.add("Spike");
       list.forEach(ele -> System.out.println(ele));
    }
}

執行結果如下圖所示:

Iterator新增forEachRemaining方法

有時候我們會使用Iterator的方式來對集合進行遍歷,因此,只要能拿到Iterator對象,就可以使用該方法進行迭代器元素的遍歷。

示例代碼如下所示:

public class TestList {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("Tom");
        list.add("Jerry");
        list.add("Spike");
        Iterator<String> iter = list.iterator();
        iter.forEachRemaining(ele -> System.out.println(ele));
    }
}

執行結果如下圖所示:

Collection新增removeIf方法

在Java8中,Collection接口新增了removeIf方法,通過該方法可以按條件刪除元素。

示例代碼如下所示:

public class TestList {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("Tom");
        list.add("Jerry");
        list.add("Spike");
        list.removeIf(ele -> ele.length() > 3);
        System.out.println(list);
    }
}

執行結果如下圖所示:

List新增sort和replaceAll方法

  • sort方法

在Java8中,List接口新增了sort和replaceAll方法,通過sort方法可以對List集合中的元素進行排序。

示例代碼如下所示:

public class TestList {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("Tom");
        list.add("Jerry");
        list.add("Alice");
        list.add("Tony");

        list.sort(Comparator.comparing(ele -> ele.length(), (o1, o2) -> o2 - o1));
        System.out.println(list);
    }
}

執行結果如下圖所示:

  • replaceAll方法

在Java8中,List接口新增了replaceAll的方法,通過replaceAll方法,可以按照指定的轉換規則替換所有的元素。

示例代碼如下所示:

public class TestList {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("Tom");
        list.add("Jerry");
        list.add("Alice");
        list.add("Tony");

        list.replaceAll(ele -> ele + ele.length());
        System.out.println(list);
    }
}

執行結果如下圖所示:

Map接口新增方法

  • remove

這裏的的remove指的是remove默認方法,而非Map接口中定義的移除指定key的方法。其聲明如下:

default boolean remove(Object key, Object value)

對於該默認方法來說,如果key對應的值與傳入的value值相等,則移除該key對應的鍵值對並返回true,如果key對應的值與傳入的value值不相等,則移除失敗,並返回false。

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        boolean isRemoved = map.remove("Tom", 22);
        System.out.println("是否移除成功:" + isRemoved + ", map的值爲:" + map);
        isRemoved = map.remove("Spike", 22);
        System.out.println("是否移除成功:" + isRemoved + ", map的值爲:" + map);
    }
}

執行結果如下圖所示:

  • forEach

forEach方法用來對Map進行遍歷。

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        map.forEach((key, value) -> {
            System.out.println("key:" + key + ", value:" + value);
        });
    }
}

執行結果如下圖所示:

  • getOrDefault

獲取某個key對應的值,若key不存在,則返回默認值。

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        System.out.println(map.getOrDefault("Jerry", 32));
        System.out.println(map.getOrDefault("Tony", 32));
    }
}

執行結果如下所示:

  • merge

該方法的作用是將傳入的值和該key對應的舊值進行合併。如果該key對應的值爲空,則直接用新傳入的值替代舊值。如果舊值不爲空,則根據傳入的計算規則、舊值和新值重新計算出一個值。

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        System.out.println(map);
        System.out.println("==================================================");
        BiFunction<Integer, Integer, Integer> reMappingFunc = (oldVal, newVal) -> oldVal + newVal;
        map.merge("Tony", 18, reMappingFunc);
        System.out.println(map);
        System.out.println("==================================================");
        map.merge("Tom", 12, reMappingFunc);
        System.out.println(map);
    }
}

執行結果如下圖所示:

  • replace

replace方法有兩個,分別爲:

  1. default V replace(K key, V value):該方法的作用是用傳入的值替代該key對應的舊值。與put方法的區別在於,如果map不存在該key的時候,不會進行插入操作。
  2. default boolean replace(K key, V oldValue, V newValue):該方法的作用是在map中找到對應的key-value後,用新值替換掉該key對應的舊值。如果map不存在該key,或根據key取到的值與傳入的舊值,都不進行替換,並返回false,表示替換失敗

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        // Tom存在,因此替換成功
        map.replace("Tom", 28);
        System.out.println(map);
        System.out.println("===================================");
        // Tony不存在,替換失敗
        map.replace("Tony", 10);
        System.out.println(map);

        System.out.println("===================================");
        // Tom-28存在,因此可以替換成功
        map.replace("Tom", 28, 32);
        System.out.println(map);
        
        System.out.println("===================================");
        // Tom-24不存在,替換失敗
        map.replace("Tom", 24, 41);
        System.out.println(map);
    }
}

執行結果如下圖所示:

  • replaceAll

該方法通過傳入的計算函數,根據key和value計算出一個新值,並進行替換。

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        map.replaceAll((key, val) -> key.length() + val);
        System.out.println(map);
    }
}

執行結果如下圖所示:

  • putIfAbsent

該方法的作用是當該key對應的值不存在時進行插入操作,否則返回該key對應的值。

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);
        
        // Tom存在,因此無法插入
        map.putIfAbsent("Tom", 28);
        System.out.println(map);

        System.out.println("============================================");
        // Tony不存在,因此成功插入
        map.putIfAbsent("Tony", 32);
        System.out.println(map);
    }
}

執行結果如下圖所示:

  • compute

該方法的作用是根據傳入的規則對該key對應的舊值進行計算。如果計算出的值不爲空,就替換舊值。如果計算出的值爲空時,舊值也爲空,則不做任何操作,否則刪除該key-value鍵值對。

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        // 計算出的值不爲空,因此使用計算出的值替換舊值
        map.compute("Tom", (key, val) -> key.length() + val);
        System.out.println(map);

        // 計算出的值爲null, 因此移除該鍵值對
        map.compute("Tom", (key, val) -> null);
        System.out.println(map);
    }
}

執行結果如下圖所示:

  • computeIfAbsent

該方法的作用是當對應的key的值爲null的時候(key的值爲null或key不在map中),根據傳入的規則計算一個新值。如果算出的值不能爲空,則進行put操作。

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        // Tom有值,因此不進行計算
        map.computeIfAbsent("Tom", key -> map.get(key) + key.length());
        System.out.println(map);

        // 計算出的值爲null,因此不做任何操作,Tony不會出現在map中
        map.computeIfAbsent("Tony", key -> null);
        System.out.println(map);

        // Tony無值,則進行計算
        map.computeIfAbsent("Tony", key -> (Objects.isNull(map.get(key)) ? 0 : map.get(key)) + key.length());
        System.out.println(map);
    }
}

執行結果如下圖所示:

  • computeIfPresent

該方法的作用是,當map中該key對應的值不爲空,則計算新值。如果計算出的值不爲空,則進行put操作。如果爲空,則移除該key。

示例代碼如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        // Tom有值,且計算出的值不爲空,因此成功替換。
        map.computeIfPresent("Tom", (key, val) -> key.length() + val);
        System.out.println(map);

        // Tom有值,但計算出的值爲空,因此移除Tom對應的鍵值對
        map.computeIfPresent("Tom", (key, val) -> null);
        System.out.println(map);
    }
}

計算結果如下圖所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章