我想查询的条件是 ( 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);
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);
List list;