2017-02-08 69 views
-3

我想从列表中筛选基于雇员的记录。对象的过滤列表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”

我希望我的问题是清楚的。

任何指针将不胜感激。

+1

我想你'一个月year'是'String',它总是格式为“00-00”吗?是1月1日还是1?并且是终止日期还是雇佣日期? – MikaelF

+0

是的我的日期是在字符串和它的1-2016格式。 1月是1 – MKS

+0

还需要一些精度......当你说“3个月的时期”时,你想要什么?在过去的三个月里? – MikaelF

回答

1

这应该对你的问题的工作:

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性能提供了干将。如果你的结构与我的结构不同,你应该能够将此解决方案应用到现有的代码中。

+0

感谢它的工作! – MKS

+0

你好,我已经格式化并为我的问题添加了详细的示例。请求你重新打开我的问题。 – MKS

+0

如果您需要解析年份字段,为什么不使用'YearMonth.parse(“02-2016”,“MM-uuuu”)?似乎对我来说更简单,不需要打扰一个月的日子。 –

0

得到公正的第一个和最后一个月的年份字符串你可以做的每个员工(与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]}