过滤对象java流的列表

时间:2017-02-08 06:32:01

标签: java java-8 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”

我希望我的问题很明确。

任何指针都会受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

这应该适合您的问题:

= 1 AND

开头的长构建器调用是因为.在一个月中没有一天的情况下无法实现= '1' AND,所以我们必须指定默认日期(在这种情况下为1)。

注意:从你的问题中不清楚你的= '2017-01'类的结构是什么,所以我认为它符合JavaBeans模式并为x<-T4A4$X79 y<-sort(x,decreasing=FALSE) View(y) vectorlength=length(y) View(vectorlength) d=dfrechet(y,shape=1) p=pfrechet(y,shape=1) q=qfrechet(p,shape=1) View(d) View(p) View(q) plot(q,y,main="Frechet") var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest; var xhr = new XHR(); xhr.open("GET", "addres/file.csv.gz", true); xhr.send(null); xhr.onload = function() { console.log( this.responseText );<---- } xhr.onerror = function() { alert( "Error " + this.status ); } 提供了getter。 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); 属性。但是,如果您的结构与我的结构不同,您应该能够将此解决方案应用到现有代码中。

答案 1 :(得分: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]}