众所周知,在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);
}
}
计算结果如下图所示: