繁体   English   中英

对象java流的过滤器列表

[英]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 模式并为HiringDateTerminationDate属性提供 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM