目的: 筛选出两个list中name和color相同的元素
public class TestController {
@Data
static class Car {
private String name;
private String color;
}
public static void main(String[] args) {
List<Car> listCar1 = constructCar1();
List<Car> listCar2 = constructCar2();
System.out.println("listCar1的值: " + JSON.toJSON(listCar1));
System.out.println("listCar2的值" + JSON.toJSON(listCar2));
//嵌套for循环操作
List<Car> listCarNew1 = new ArrayList<>();
for (Car car1 : listCar1) {
for (Car car2 : listCar2) {
if (car1.getName().equals(car2.getName()) && car1.getColor().equals(car2.getColor())) {
Car car = new Car();
BeanUtils.copyProperties(car1, car);
listCarNew1.add(car);
}
}
}
System.out.println("嵌套for循环筛选后的结果" + JSON.toJSON(listCarNew1));
//java 8 stream操作
List<Car> listCarNew2 = listCar1.stream().filter(a -> listCar2.stream()
.anyMatch(b -> a.getColor().equals(b.getColor()) && a.getName().equals(b.getName())))
.collect(Collectors.toList());
System.out.println("stream操作筛选后的结果" + JSON.toJSON(listCarNew2));
}
public static List<Car> constructCar1() {
List<Car> listOld = new ArrayList<>();
Car car1 = new Car();
car1.setName("A");
car1.setColor("红");
Car car2 = new Car();
car2.setName("B");
car2.setColor("黄");
Car car3 = new Car();
car3.setName("C");
car3.setColor("蓝");
Car car4 = new Car();
car4.setName("D");
car4.setColor("黑");
listOld.add(car1);
listOld.add(car2);
listOld.add(car3);
listOld.add(car4);
return listOld;
}
public static List<Car> constructCar2() {
List<Car> listOld = new ArrayList<>();
Car car1 = new Car();
car1.setName("A");
car1.setColor("红");
Car car2 = new Car();
car2.setName("B");
car2.setColor("黄");
Car car3 = new Car();
car3.setName("E");
car3.setColor("绿");
listOld.add(car1);
listOld.add(car2);
listOld.add(car3);
return listOld;
}
}
执行后的结果
listCar1的值: [{"color":"红","name":"A"},{"color":"黄","name":"B"},{"color":"蓝","name":"C"},{"color":"黑","name":"D"}]
listCar2的值[{"color":"红","name":"A"},{"color":"黄","name":"B"},{"color":"绿","name":"E"}]
嵌套for循环筛选后的结果[{"color":"红","name":"A"},{"color":"黄","name":"B"}]
stream操作筛选后的结果[{"color":"红","name":"A"},{"color":"黄","name":"B"}]
match用法介绍
boolean anyMatch(Predicate<? super T> predicate)
只要有一个条件满足即返回true
boolean allMatch(Predicate<? super T> predicate)
必须全部都满足才会返回true
boolean noneMatch(Predicate<? super T> predicate)
全都不满足才会返回true
额外添加
筛选出listAll不包含在listParam中的数字
public static void main(String[] args) {
List<String> listAll = new ArrayList<>();
listAll.add("1");
listAll.add("2");
listAll.add("3");
listAll.add("4");
listAll.add("5");
List<String> listParam = new ArrayList<>();
listParam.add("1");
listParam.add("5");
listParam.add("6");
List<String> collect = listAll.stream().filter(a -> listParam.stream().noneMatch(a::equals)).collect(toList());
System.out.println(collect);
}
结果
[2, 3, 4]
同理, 过虑出car1中的对象不在car2中的数据有
//java 8 stream操作
List<Car> listCarNew2 = listCar1.stream().filter(a -> listCar2.stream()
.noneMatch(b -> a.getColor().equals(b.getColor()) && a.getName().equals(b.getName())))
.collect(Collectors.toList());
System.out.println("stream操作筛选后的结果" + JSON.toJSON(listCarNew2));
结果
listCar1的值: [{"color":"红","name":"A"},{"color":"黄","name":"B"},{"color":"蓝","name":"C"},{"color":"黑","name":"D"}]
listCar2的值: [{"color":"红","name":"A"},{"color":"黄","name":"B"},{"color":"绿","name":"E"}]
嵌套for循环筛选后的结果[{"color":"红","name":"A"},{"color":"黄","name":"B"}]
stream操作筛选后的结果[{"color":"蓝","name":"C"},{"color":"黑","name":"D"}]