java8 .stream().filter() 代替嵌套for循环 lambda表达式

目的: 筛选出两个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"}]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值