如何解决有什么方法可以使用自定义条件打破Java Stream并收集所有项目,直到条件使用Java 8匹配到列表为止
问题:我有一些收集列表,需要在 Java 8 中以以下条件过滤,
- 以日期降序排列列表中的对象(日期也可以为null)
- 对列表中的每个元素进行一次迭代,并验证某个条件,如果条件匹配,则仅中断迭代并返回所有元素(直到条件匹配),然后忽略其余元素。
代码段:
public class Employee {
private int empId;
private String empName;
private Date empDob;
//Constructor
//Getter Setter
}
测试类:
public static void main(String[] args) {
List<Employee> asList = Arrays.asList(new Employee(1,"Emp 1",getDate(1998)),new Employee(2,"Emp 2",getDate(2005)),new Employee(3,"Emp 3",getDate(2000)),new Employee(4,"Emp 4",null),new Employee(5,"Emp 5",getDate(1990)),new Employee(6,"Emp 6",new Date()));
List<Employee> result = asList.stream()
.sorted(Comparator.comparing(Employee::getEmpDob,Comparator.nullsLast(Comparator.reverseOrder())))
.filter(i -> i.getEmpName() != null && !StringUtils.isEmpty(i.getEmpName())
&& i.getEmpName().equals("Emp 3"))
.collect(Collectors.toList());
System.out.println(result);
}
public static Date getDate(int year) {
Calendar c1 = Calendar.getInstance();
c1.set(year,01,01);
return c1.getTime();
}
我尝试过的上述代码仅返回与条件和结果匹配的元素:
[Employee [empId=3,empName=Emp 3,empDob=Wed Feb 01 15:55:57 MYT 2000]]
我需要做的预期输出:
我期望的结果如下所示(它应该收集所有元素,直到条件匹配为止)
[Employee [empId=6,empName=Emp 6,empDob=Sat Aug 15 16:06:22 MYT 2020],Employee [empId=2,empName=Emp 2,empDob=Tue Feb 01 16:06:22 MYT 2005],Employee [empId=3,empDob=Tue Feb 01 16:06:22 MYT 2000]]
解决方法
我建议Picking elements of a list until condition is met with Java 8 Lambdas
的解决方案-
自己做
Accumulator
和Collector
result = asList.stream().collect(ArrayList::new,(l,e) -> { if (l.isEmpty() || !l.get(l.size() - 1).getEmpName().equals("Emp 3")) l.add(e); },(l1,l2) -> { if (l1.isEmpty() || !l1.get(l1.size() - 1).getEmpName().equals("Emp 3")) l1.addAll(l2); });
-
需要JAVA> = 9 :在停止之前使用
Stream.takeWhile()
获取所有元素,然后检索要停止的元素// Add all element until the first Emp3 List<Employee> result = asList.stream() .sorted(comparing(Employee::getEmpDob,nullsLast(reverseOrder()))) .takeWhile(i -> i.getEmpName() != null && !i.getEmpName().isEmpty() && !i.getEmpName().equals("Emp 3")) .collect(Collectors.toList()); // Add the first Emp3 asList.stream() .sorted(comparing(Employee::getEmpDob,nullsLast(reverseOrder()))) .filter(i -> i.getEmpName() != null && !i.getEmpName().isEmpty() && i.getEmpName().equals("Emp 3")) .findFirst().ifPresent(result::add);
它们都不是很好,但是似乎没有很好的方法
,您应该获取所选员工的日期,然后过滤所有日期大于或等于其日期的员工,然后对其进行排序。
List<Employee> asList = Arrays.asList(new Employee(1,"Emp 1",getDate(1998)),new Employee(2,"Emp 2",getDate(2005)),new Employee(3,"Emp 3",getDate(2000)),new Employee(4,"Emp 4",null),new Employee(5,"Emp 5",getDate(1990)),new Employee(6,"Emp 6",new Date()));
Date searchedEmpDate = asList.stream()
.filter(i -> i.getEmpName() != null && !i.getEmpName().isEmpty()
&& i.getEmpName().equals("Emp 3")).findAny().get().getEmpDob();
List<Employee> result = asList.stream()
.filter(i -> i.getEmpDob() != null && i.getEmpDob().compareTo(searchedEmpDate) >= 0)
.sorted(Comparator.comparing(Employee::getEmpDob,Comparator.nullsLast(Comparator.reverseOrder())))
.collect(Collectors.toList());
System.out.println(result);
,
Java 9 +
在Java 9+中,您可以将takeWhile()用作-
List<Employee> result = asList.stream()
.sorted(Comparator.comparing(Employee::getEmpDob,Comparator.nullsLast(Comparator.reverseOrder())))
.takeWhile(Predicate.not(i -> (i.getEmpName() != null && !StringUtils.isEmpty(i.getEmpName())
&& i.getEmpName().equals("Emp 3"))))
.collect(Collectors.toList());
请注意使用Predicate.not
,它将评估表达式直到满足条件(即直到遇到“ Emp 3” 否。List<Employee> result
不包括“ Emp 3” ”。添加“ Emp 3”
asList.stream()
.sorted(Comparator.comparing(Employee::getEmpDob,Comparator.nullsLast(Comparator.reverseOrder())))
.filter(i -> i.getEmpName() != null && !StringUtils.isEmpty(i.getEmpName())
&& i.getEmpName().equals("Emp 3"))
.collect(Collectors.toCollection(() -> result));
Java 8 +
您可以按照here的描述实现自己的takeWhile,也可以模拟为takeWhile为(此方法采用排序列表)
public static <T> List<T> takeWhile(List<T> list,Predicate<T> p) {
int i = 0;
for (T item : list) {
if (!p.test(item)) {
return list.subList(0,i);
}
i++;
}
return list;
}
并致电-
List<Employee> employees = takeWhile(asList.stream()
.sorted(Comparator.comparing(Employee::getEmpDob,Comparator.nullsLast(Comparator.reverseOrder())))
.collect(Collectors.toList()),i -> i.getEmpName() != null && !StringUtils.isEmpty(i.getEmpName())
&& i.getEmpName().equals("Emp 3"));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。