高效开发之:删除list集合中某个符合条件的对象

1、王炸方法

使用java8中的方法,代码更简洁且线程安全:

按条件删除字符串集合

List<String> list = userSessionListTools.getBDUserSessionList(userToken, belongTo, redisTemplate);
list.removeIf(item -> item.equals(sessionId));

按条件删除复杂对象集合

List<Person> persons = ... 
persons.removeIf(person -> person.getAge() > 30); 

2、装X方法

IntStream.range(0,list.size()).filter(i->
                    list.get(i).equals(sessionId)).
                    boxed().findFirst().map(i->list.remove((int)i));

非必要不建议这样写,没有好处只有坏处。
有的小伙伴可能对这段代码有疑问,这里逐步解析一下。

  • IntStream.range(0, list.size()): 这会产生一个整数流,范围从0到list.size() - 1。简单地说,它为列表的每个索引产生一个整数。
  • .filter(i -> list.get(i).equals(sessionId)): 这是一个过滤操作。它过滤出那些满足条件list.get(i).equals(sessionId)的索引i。换句话说,它找到所有与sessionId相等的元素的索引。
  • .boxed(): 因为原始的流是IntStream,所以它的元素是原始数据类型int。boxed()方法将每个int元素转换为Integer对象,使我们可以在后续的流操作中处理它们。
  • .findFirst(): 从过滤后的索引列表中查找第一个元素(如果存在)。它返回一个Optional,这意味着可能存在一个值,也可能不存在。
  • .map(i -> list.remove((int)i)): 如果findFirst()找到了一个值,这里会尝试删除列表中对应的元素。map操作会将找到的索引i转换为list.remove((int)i)的结果。如果findFirst()没有找到值,则此map操作不会被执行。

注意哦,这段代码的行为在高并发环境下是不安全的,因为它在遍历列表的同时删除了元素。如果你在多线程环境中运行此代码或使用类似的逻辑,可能会遇到并发修改异常或其他不可预测的行为。

你可能感兴趣的:(高效开发,list,数据结构)