有时候拿到一个list的时候,可能需要过滤一些元素,让它只展示我们希望的元素。
假设有两个列表,要求只展示含2,3的元素
list [1,2,3,4]
TEST_LIST [2,3]
有几种方法呢?
-
用两个for循环判断是否包含,包含的,就添加到新的listNew里
-
用迭代器,不包含的remove
-
for循环用contains判断是否包含,包含的,就添加到新的listNew里
-
Java8 lamda stream过滤
具体写法:
package com.xy.demo;
import java.util.*;
import java.util.stream.Collectors;
/**
* @ClassName ListDemo
* @Description
* @Author Administrator
* @Date 2022/4/8
* @Version 1.0
**/
public class ListDemo {
static volatile List<Integer> TEST_LIST = new ArrayList<>();
static List<Map<String,Integer>> list = new ArrayList<>();
static {
TEST_LIST.add(2);
for (int i = 1; i <=3; i++) {
Map<String,Integer> map = new HashMap<>();
map.put("id",i);
list.add(map);
}
}
public static void main(String[] args) {
System.out.println(list);
//一、list 包含TEST_LIST 才保留,其余删除
int ways = 3;
switch (ways) {
case 0:{//方法一、for双循环
List<Map<String,Integer>> listNew = new ArrayList();
for (Map<String,Integer> map : list) {
boolean flag = false;
Integer id = map.get("id");
for (Integer tmpId : TEST_LIST) {
if (tmpId.equals(id)) {
flag = true;
break;
}
}
if(flag){//不包含加!
listNew.add(map);
}
}
list = listNew;
break;
}
case 1: {//方法二、迭代器
Iterator<Map<String, Integer>> iterator = list.iterator();
while (iterator.hasNext()) {
boolean flag = false;
Map<String, Integer> next = iterator.next();
for (Integer integer : TEST_LIST) {
if (integer.equals(next.get("id"))) {
flag = true;
break;
}
}
if (!flag) {//不包含去!
iterator.remove();
}
}
break;
}
case 2:{//方法三、利用list的contains方法
List<Map<String,Integer>> listNew = new ArrayList();
for (Map<String,Integer> map : list) {
Integer id = map.get("id");
if (TEST_LIST.contains(id)) {//不包含加!
listNew.add(map);
}
}
list = listNew;
break;
}
case 3:{//方法四、用Java8 lamda写法流过滤
List<Map<String, Integer>> listNew = list.stream()
.filter(Objects::nonNull)
.filter(x -> TEST_LIST.contains(x.get("id")))//不包含加!
.collect(Collectors.toList());
list = listNew;
break;
}
}
System.out.println("after--"+list);
}
}