在带有属性的Java8中使用GROUPBY

在带有属性的Java8中使用GROUPBY,java,lambda,java-8,java-stream,collectors,Java,Lambda,Java 8,Java Stream,Collectors,不幸的是,我得到了以下编译错误 DateFormat类型中的parseString方法不适用于参数Person::getDateOfBirth 此表达式的目标类型必须是函数接口 如果lambda表达式是直接方法调用,则使用方法引用运算符替换它,但在您的示例中,您正尝试基于sdf.parse的结果执行groupingBy 使用lambda表达式创建匿名方法。但是,有时lambda表达式只调用现有方法。在这些情况下,按名称引用现有方法通常更清晰。方法引用使您能够做到这一点;对于已经有名称的方法,它们

不幸的是,我得到了以下编译错误

DateFormat类型中的parseString方法不适用于参数Person::getDateOfBirth 此表达式的目标类型必须是函数接口
如果lambda表达式是直接方法调用,则使用方法引用运算符替换它,但在您的示例中,您正尝试基于sdf.parse的结果执行groupingBy

使用lambda表达式创建匿名方法。但是,有时lambda表达式只调用现有方法。在这些情况下,按名称引用现有方法通常更清晰。方法引用使您能够做到这一点;对于已经有名称的方法,它们是紧凑、易于阅读的lambda表达式

此外,您还需要处理来自ParseException的parse方法,此外,它返回java.util.Date,所以您需要将返回类型更改为Map

但是,如果要使用SimpleDataFormat,则需要处理异常

public Date parse(String source) throws ParseException
注意:您的输入日期字符串2/1/18和格式模式MM/dd/yy都有效,但返回类型将根据实现进行更改,下面是示例

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yy");

 Map<LocalDate,List<Person>> personByCity = people.stream() 
                      .collect(Collectors.groupingBy(person->LocalDate.parse(person.getDateOfBirth(),formatter)); 

首先,你说日期的格式是MM/DD/YYYY,但实际上不是。您的数据应定义为:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yy");

LocalDate date = LocalDate.parse("02/01/18", formatter);

System.out.println(date);      //2018-02-01

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy");

Date d = sdf.parse("02/01/18");

System.out.println(d);       //Thu Feb 01 00:00:00 CST 2018

变量personByCity的名称是错误的,表示按城市分组。但这当然不是解决办法。我会在办公室查一下。我从来没有见过将日期存储为字符串,或者每次提取时都转换它。尝试在构建时转换它并将其存储为日期。然后把它作为约会对象。这应该行得通。person.getDateOfBirth是不包含person对象方法的对象。感谢您抽出时间,我可以根据date属性按升序排序数据吗?谢谢,它行得通。我们可以使用date进行排序吗,应首先显示最低日期。在这种情况下,请考虑向上投票/接受答案。你能说得更具体一点吗?你想在什么基础上对日期进行排序?
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yy");

 Map<LocalDate,List<Person>> personByCity = people.stream() 
                      .collect(Collectors.groupingBy(person->LocalDate.parse(person.getDateOfBirth(),formatter)); 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yy");

LocalDate date = LocalDate.parse("02/01/18", formatter);

System.out.println(date);      //2018-02-01

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy");

Date d = sdf.parse("02/01/18");

System.out.println(d);       //Thu Feb 01 00:00:00 CST 2018
List<Person> people = new ArrayList<>(); // Date Format is MM/DD/YYYY
people.add(new Person("John", "London", 21, "02/01/2018"));
people.add(new Person("Swann", "London", 21, "03/05/2018"));
people.add(new Person("Kevin", "London", 23, "03/12/2018"));
people.add(new Person("Monobo", "Tokyo", 23, "04/18/2018"));
people.add(new Person("Sam", "Paris", 23, "07/12/2018"));
people.add(new Person("Nadal", "Paris", 31, "04/02/2019"));
Map<LocalDate, List<Person>> personByCity = new HashMap<>();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy");
personByCity = people.stream()
            .collect(Collectors.groupingBy(p -> LocalDate.parse(p.getDateOfBirth(), dtf)));