【发布时间】:2020-04-22 18:44:43
【问题描述】:
我有一个关于 Java 8 流的具体问题。即使听起来不太复杂,我也找不到任何接近解决问题的方法。
我想将List<Person> 转换为Map<Company, List<Person>>。该公司是一个枚举。现在Map 应该由Company 分组(到目前为止我一切正常。在我想通过属性过滤Map 的所有List<Person> 之后:Person 的名称。我只想要将名字最长的人放在里面。例如:
这是我目前得到的:
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
public class PersonMap {
public static void main(String[] args) {
Person person1 = new Person("Pete", Company.APPLE);
Person person2 = new Person("Joe", Company.APPLE);
Person person3 = new Person("Jack", Company.APPLE);
Person person4 = new Person("Robert", Company.MICROSOFT);
Person person5 = new Person("Cate", Company.MICROSOFT);
Person person6 = new Person("Abi", Company.MICROSOFT);
List<Person> list = new LinkedList<>();
list.add(person1);
list.add(person2);
list.add(person3);
list.add(person4);
list.add(person5);
list.add(person6);
}
public Map<Company, List<Person>> groupPersonByCompanyAndFilterByName (List <Person> list){
Map<Company, List<Person>> outputMap =
list.stream().collect(Collectors.groupingBy(Person::getCompany))
.entrySet().stream()
.filter(p -> p.getValue().stream().toString().length() !=
p.getValue().stream().map(Person::getName).mapToInt(String::length).max().getAsInt())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
return outputMap;
}
}
过滤功能在这里不起作用。我想要的输出是:
{MICROSOFT=["person4"], APPLE=[person1, person3]}
谁有好的知识可以帮帮我!
【问题讨论】:
-
我不认为只用流来做到这一点的好方法。您可以在之后浏览每个单独的子列表,找到并记住最长名称的长度,然后在第二遍中过滤掉没有该长度的所有内容。或者,您浏览子列表一次并将所有名称添加到另一个列表中,如果它们等于您迄今为止遇到的最长的名称。如果您遇到的名称比您目前找到的最长名称要长,请先清除当前列表,然后再添加该名称。
标签: java dictionary filter java-stream groupingby