这个lambda表达式怎么解?

我想查询的条件是 ( or多个or )and 多个 and 这种格式,or里面的参数不定,是个list表,最少是一个,怎么编写。


        Predicate<Integer> predicate = (e) -> e != 0;
        predicate.and(e -> e < 10).and(e -> e > 3);
        predicate.or(e -> e == 12).or(e -> e == 1);
        List<Integer> result = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
                .filter(predicate).collect(Collectors.toList());

lambda本质上是简短的函数,你这个功能如果用lambda写不出来,就尝试用函数来写吧。

这个我知道


 Integer[] ints = IntStream.range(1, 10).limit(10).boxed().toArray(Integer[]::new);
        System.out.println(Arrays.toString(ints));
        List<Predicate<Integer>> list = new ArrayList<>();
        Predicate<Integer> predicate = e->e==1;
        Predicate<Integer> predicate1 = e->e==2;
        Predicate<Integer> predicate2 = e->e==5;
        Predicate<Integer> predicate3 = e->e==4;

        predicate = predicate.or(predicate1).or(predicate2).or(predicate3);
        list.add(predicate);


        Predicate<Integer> predicateAnd = e->e%2==0;
        list.add(predicateAnd);

        Predicate resultPredicate = null;

        for (Predicate<Integer> pre : list) {
            if (resultPredicate == null){
                resultPredicate = pre;
            }else {
                resultPredicate = resultPredicate.and(pre);
            }
        }

        /**
         * 筛选(1or 2 or 4 or 5) and (偶数)
         */
        Arrays.stream(ints).filter(resultPredicate).forEach(System.out::println);


img

 Integer[] ints = IntStream.range(1, 10).limit(10).boxed().toArray(Integer[]::new);
        System.out.println(Arrays.toString(ints));
        List<List<Predicate<Integer>>> andList = new ArrayList<>();
        Predicate<Integer> predicate = e->e==1;
        Predicate<Integer> predicate1 = e->e==2;
        Predicate<Integer> predicate2 = e->e==5;
        Predicate<Integer> predicate3 = e->e==4;

        List<Predicate<Integer>> orList1 = new ArrayList<>();
        orList1.add(predicate);
        orList1.add(predicate1);
        orList1.add(predicate2);
        orList1.add(predicate3);
        andList.add(orList1);

        List<Predicate<Integer>> orList2 = new ArrayList<>();
        Predicate<Integer> predicateAnd = e->e%2==0;
        orList2.add(predicateAnd);
        andList.add(orList2);

        Predicate resultPredicate = null;

        for (List<Predicate<Integer>> predicates : andList) {
            Predicate p1 = null;
            for (Predicate<Integer> pre : predicates) {
                if (p1 == null){
                    p1 = pre;
                }else {
                    p1 = p1.or(pre);
                }
            }
            if (resultPredicate == null){
                resultPredicate = p1;
            }else {
                resultPredicate = resultPredicate.and(p1);
            }
        }


        /**
         * 筛选(1or 2 or 4 or 5) and (偶数)
         */
        Arrays.stream(ints).filter(resultPredicate).forEach(System.out::println);

img

List list;