我有一个简单的ArrayList,其中包含人名和他们的年龄(Person对象).
class Person {
String name;
int age;
}
List<Person> personList = new ArrayList<>();
personList.add(new Person("john", 47));
personList.add(new Person("john", 35));
personList.add(new Person("john", 12));
personList.add(new Person("britney", 27));
personList.add(new Person("britney", 16));
我们的目标是制作ArrayList个人,每个名字都有最大年龄,但不使用Stream API.与SQL的SELECT name, max(AGE) FROM P GROUP BY name
类似:
[Person("John",47),Person("Britney",27)]
使用Stream API时,我是这样做的:
personList.stream()
.collect(Collectors
.groupingBy(Person::getName,
Collectors.maxBy(Comparator.comparing(Person::getAge))))
.values().stream()
.map(s -> s.orElseGet(Person::new))
.collect(Collectors.toList());
但我怀疑,在没有Stream API的情况下,我做得是否最好(代码如下).
下面的代码是最优的方式吗?如果不是,请描述您的,并提及O-Complex.
Second question:以上使用Stream API的解决方案具有哪种O复杂性?令人惊讶的是,使用函数方法我无法理解它.
Map<String, Integer> personAgg = new HashMap<>();
personList.forEach(personAdd -> {
var currentKey=personAdd.getName();
var currentValue=personAdd.getAge();
if (personAgg.containsKey(currentKey)) {
if (personAgg.get(currentKey) < currentValue)
personAgg.put(currentKey, currentValue);
} else {
personAgg.put(currentKey, currentValue);
}
});
List<Person> personAggArray = new ArrayList<>();
personAgg.forEach((k,v) -> personAggArray.add(new Person(k,v)));