作用:
删除集合中符合条件的成员,empty集合也可以,但是null就坏啦。
list 集合的 removeIf()
直接看代码和运行结果
/**
* 删除集合中符合条件的成员,empty集合也可以,但是null就坏啦。
*/
private static void removeIfTest() {
List<String> list = Lists.newArrayList("1","12","13","14","15","0");
System.out.println("初始时:"+ list.toString());
list.removeIf(s -> s.contains("1"));
System.out.println("过滤完:" + list.toString());
}
可以看到,代码的运行效果就是把集合里面元素包含“1”的都给删除啦。
下面是咱1.8之前的做法
/**
* 咱之前是怎么从集合中过滤掉不要的元素的
*/
private static void beforeRemove() {
List<String> list = Lists.newArrayList("1", "12", "13", "14", "15", "0");
System.out.println("初始时:" + list.toString());
System.out.println("for i 循环删除元素");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).contains("1")) {
list.remove(i);
//一般之前这么操作集合的时候,估计都是会忘记 i-- 的
i--;
}
}
System.out.println("过滤完:" + list.toString());
System.out.println("Iterator 迭代器 循环删除元素");
list = Lists.newArrayList("1", "12", "13", "14", "15", "0");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
if (iterator.next().contains("1")) {
iterator.remove();
}
}
System.out.println("过滤完:" + list.toString());
System.out.println("加强 for 循环 循环删除元素,直接异常。");
list = Lists.newArrayList("1", "12", "13", "14", "15", "0");
for (String s : list) {
if (s.contains("1")) {
list.remove(s);
}
}
System.out.println("过滤完:" + list.toString());
}
运行的结果如下:
报错的原因是你在循环一个集合的同时,修改了集合的size,然后就异常了,这个很常见。
最后,看看源码,多说一丢丢。
直接点击,跳转到源码位置,发现如下;
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
2,map集合的removeIf()例子
代码如下:
@Test
public void mapRemoveIf() {
Map<String, String> map = CollectionUtil.getMap(4);
// {0=0, 1=1, 2=2, 3=3}
System.out.println(map.toString());
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String value = map.get(key);
if (key.equals("1")) {
iterator.remove();
}
}
// {0=0, 2=2, 3=3}
System.out.println(map.toString());
map.values().removeIf(v -> v.equals("2"));
// {0=0, 3=3}
System.out.println(map);
map.keySet().removeIf(k->k.equals("3"));
System.out.println(map);
}
对于map的remove,要想在循环的时候,把符合条件的给删掉,就得使用迭代器来操作。很麻烦,但是要不这么干,就会出现上述的Concurrent modify 异常。但是,这个jdk8的 map的removeIf()就好简单呢。不论是根据key来判断,还是根据value来判断,都能简单的实现remove这个动作。实际运行结果如下图。