作用:
删除集合中符合条件的成员,empty集合也可以,但是null就坏啦。
直接看代码和运行结果
/**
* 删除集合中符合条件的成员,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());
}
运行的结果如下:
最后,看看源码,多说一丢丢。
直接点击,跳转到源码位置,发现如下;
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;
}
逻辑很简单,但是,我要说的,你不一定就知道哟。
首先,这个方法是在 Collection 这个接口 里面的,接口哟,interface哟。不是 class。不是抽象类。是接口。
还有就是这个方法的修饰,没有常见的 public private protect,没有,因为接口不写,默认就是 public 的吧。
这个地方使用的是 default 修饰的。
这个default,只是提供默认的方法实现,但是,这个接口的实现类是可以覆盖这个方法的,
对,所以,上面我的代码里面,使用的是arraylist,所以,这个方法在arraylist类里面被覆盖啦。
所以,你调用的不一定就是这个Collection里面的这个方法
还有,就是说,咱总结东西,不是说非得系统的去学习总结,老铁们可不会系统的去搜索啊,都是遇到啦,才会去搜索一下的。
谁能一下子把jdk 1.8的东西一篇文章讲完。
不可能的
所以,还是遇到一个方法,总结一点,慢慢的,就总结的差不多啦。jdk 1.8 也就使用的差不多啦,虽然现在1.8已经老啦,不算是啥新鲜东西啦。但是,还是很多人,没有大面积使用的。
真的是最后啦。
我写完文章,给自己点个赞,不过分吧,
不过分,那我可就点啦啊。
我先点为敬,你们随意。大家随意。不要客气。。。