衆所周知,在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方法有兩個,分別爲:
-
default V replace(K key, V value):該方法的作用是用傳入的值替代該key對應的舊值。與put方法的區別在於,如果map不存在該key的時候,不會進行插入操作。
-
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);
}
}
計算結果如下圖所示: