Java流排序和过滤器()

问题描述 投票:1回答:4

我对Java 8流有一个特定的问题。即使听起来不太复杂,我也找不到任何与解决我的问题接近的方法。

我想将List<Person>转换为Map<Company, List<Person>>。该公司是一个枚举。现在Map应该按Company分组(到目前为止,我可以正常使用。在我想通过属性List<Person>的名称过滤Map的所有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 stream groupingby
4个回答
1
投票

这里是使用发球的方法


0
投票

为了获得更好的性能,您不应该在单个流链中做到这一点。


0
投票

您可以根据多个字段Companyname的长度进行分组


-2
投票
     Person person1 = new Person("Pete", "APPLE");
            Person person2 = new Person("Joe", "APPLE");
            Person person3 = new Person("Jack", "APPLE");
            Person person4 = new Person("Robert", "MICROSOFT");
            Person person5 = new Person("Cate", "MICROSOFT");
            Person person6 = new Person("Abi", "MICROSOFT");

            List<Person> list = new ArrayList<>();

            list.add(person1);
            list.add(person2);
            list.add(person3);
            list.add(person4);
            list.add(person5);
            list.add(person6);

  //Adapt your structure and with this function you can group  
            Map<String, List<Person>> map = list.stream().collect(Collectors.groupingBy(person -> person.getCompany()));

            for (String name: map.keySet()){
                List<Person> persons = map.get(name);
                System.out.println("[" + name + "]");
                persons.forEach(s -> System.out.println(s.getName()));
            }
© www.soinside.com 2019 - 2024. All rights reserved.