[英]filter list of Objects java stream
我想从列表中过滤基于员工的记录。
我的员工对象看起来像
<pre>new Employee(EmpID, EmpName,"month-year",Transition)
我可以为每个具有不同过渡和月份年份的员工拥有多个对象,例如<pre>Hired , Bench, joinedproject,releasedproject,resign
和各自的日期
现在我想从每个员工的第一个和最后一个对象中获取月-年。
例如
<pre>new Employee(1, "alex","02-2016","Hired")
new Employee(1, "alex","02-2016","Bench")
new Employee(1, "alex","03-2016","Project")
new Employee(1, "alex","12-2016","Resign")
new Employee(1, "alex","01-2017","Exit")
对于上面的例子,我会得到“02-2016”和“01-2017”的日期
我希望我的问题很清楚。
任何指针将不胜感激。
这应该适用于您的问题:
List<Employee> list = ...
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("MM-yyyy")
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.toFormatter();
list.removeIf(e -> LocalDate.parse(e.getHiringDate(), formatter)
.until(LocalDate.parse(e.getTerminationDate(), formatter)).getMonths() < 3);
开头很长的构建器调用是因为LocalDate.parse
不能在没有一个月中的某一天的情况下实例化LocalDate
,所以我们必须指定一个默认的日期(在本例中为 1)。
注意:从你的问题中不清楚你的Employee
类的结构是什么,所以我假设它符合 JavaBeans 模式并为HiringDate
和TerminationDate
属性提供 getter。 尽管如此,如果您的结构与我的不同,您应该能够将此解决方案应用到您现有的代码中。
要获取每个员工的第一个和最后一个月份的字符串,您可以这样做(使用 Java 8 流):
String[][] monthYears = employeeTransitions.stream()
.collect(Collectors.groupingBy(Employee::getId))
.values()
.stream()
.map(transList -> new String[]{ transList.get(0).getMonthYear(),
transList.get(transList.size() - 1).getMonthYear() })
.toArray(String[][]::new);
我在您的列表中又添加了一名Employee
new Employee(2, "mks", "02-2017", "Hired")
,以使用多个员工 ID 对其进行测试。 上面的代码现在产生:
[[02-2016, 01-2017], [02-2017, 02-2017]]
我们在这里注意到两件事: 员工 ID 没有耦合。 对于我在列表中仅添加一条记录的员工,我得到的第一个和最后一个月年字符串相同,我认为这没问题。
将月份与员工 ID 关联起来并不复杂:
Map<Integer, List<String>> monthYearPerEmployee = employeeTransitions.stream()
.collect(Collectors.groupingBy(Employee::getId))
.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> {
List<Employee> transitionsForEmployee = entry.getValue();
return Arrays.asList(transitionsForEmployee.get(0).getMonthYear(),
transitionsForEmployee.get(transitionsForEmployee.size() - 1).getMonthYear());
}));
现在我们得到:
{1=[02-2016, 01-2017], 2=[02-2017, 02-2017]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.