【发布时间】:2021-12-27 16:23:28
【问题描述】:
我有一个Person 对象列表。 id 是 Person 类的属性之一。该列表可以包含具有相同 id 和不同其他属性的 Person 的重复项。
现在我需要计算相同id 的出现次数,然后将按timestamp 排序的分组Persons 转换为另一个具有occurrences 属性的对象。
我想出了这样的东西,我想知道是否有任何方法可以简化这个过程:
List<Person> persons = Arrays.asList(new Person("A", "2021-12-27"), new Person("B", "2021-12-26"), new Person("A", "2021-12-25"));
Map<String, Long> personToOccurrence = persons
.stream()
.collect(Collectors.groupingBy(Person::getUserName, Collectors.counting()));
List<NewClass> convertedPersonsWithOccurrences = persons
.stream()
.filter(distinctByKey(Person::getUserName))
.map(i -> convertToNewClass(i, personToOccurrence.get(i.getUserName())))
.collect(Collectors.toList());
class Person {
String id;
Date timestamp;
}
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
所以在convertedPersonsWithOccurrences 我希望有:
NewClass("A", "2021-12-27", 2)
NewClass("B", "2021-12-26", 1)
其中最后一个属性是id 属性在persons 列表中的出现。
编辑:
总的来说,这些类已被简化。在实际情况下,convertToNewClass 应该接受具有多个字段的整个对象并将其转换为新类。所以这就是为什么我给出了传递整个 Person 对象和事件的例子。
【问题讨论】:
标签: java lambda java-stream