gpt4 book ai didi

Java 8 流到 Map>

转载 作者:搜寻专家 更新时间:2023-10-31 08:32:06 25 4
gpt4 key购买 nike

这是要在 Java 8 流中处理的 Java 对象

private static List<Person> getPersons() {
List<Person> results = new ArrayList<Person>();

results.add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));
results.add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500));
results.add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800));
results.add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600));
results.add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));
results.add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900));
results.add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300));
results.add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700));
results.add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));
results.add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));

results.add(new Person("Jarrod", "Pace", "PHP programmer", "male", 34, 1550));
results.add(new Person("Clarette", "Cicely", "PHP programmer", "female", 23, 1200));
results.add(new Person("Victor", "Channing", "PHP programmer", "male", 32, 1600));
results.add(new Person("Tori", "Sheryl", "PHP programmer", "female", 21, 1000));
results.add(new Person("Osborne", "Shad", "PHP programmer", "male", 32, 1100));
results.add(new Person("Rosalind", "Layla", "PHP programmer", "female", 25, 1300));
results.add(new Person("Fraser", "Hewie", "PHP programmer", "male", 36, 1100));
results.add(new Person("Quinn", "Tamara", "PHP programmer", "female", 21, 1000));
results.add(new Person("Alvin", "Lance", "PHP programmer", "male", 38, 1600));
results.add(new Person("Evonne", "Shari", "PHP programmer", "female", 40, 1800));

return results;
}

然后我生成具有键值 “age” 的 Map 对象。这是代码

    Function<Person, Map<String, String>> nameNsalary = (Person p) -> {
Map<Int, String> map = new HashMap<Int,String>();

if (p.getAge()>=40)
map.put(40 , p.getFirstName() + " " + p.getLastName() +":" + p.getSalary());
else if(p.getAge()>=30 && p.getAge()<40)
map.put(30 , p.getFirstName() + " " + p.getLastName() +":" + p.getSalary());
else if(p.getAge()<20)
map.put(20 , p.getFirstName() + " " + p.getLastName() +":" + p.getSalary());
else
map.put(10 , p.getFirstName() + " " + p.getLastName() +":" + p.getSalary());

return map;
};

persons.stream().map(nameNsalary).forEach(System.out::println);

输出 map 对象成功如下,

{40=Elsdon Jaycob:2000}
{20=Tamsen Brittany:1500}
{30=Floyd Donny:1800}
{30=Sindy Jonie:1600}
{20=Vere Hervey:1200}
{20=Maude Jaimie:1900}
{30=Shawn Randall:2300}
{30=Jayden Corrina:1700}
{30=Palmer Dene:2000}
{30=Addison Pam:1300}
{30=Jarrod Pace:1625}
{20=Clarette Cicely:1260}
{30=Victor Channing:1680}
{20=Tori Sheryl:1050}
{30=Osborne Shad:1155}
{20=Rosalind Layla:1365}
{30=Fraser Hewie:1155}
{20=Quinn Tamara:1050}
{30=Alvin Lance:1680}
{40=Evonne Shari:1890}

但是我无法从 Map<Integer, String> 更改输出类型至 Map<Integer, List<String>> ,例如,

30 = [Jayden Corrina:1700, Palmer Dene:2000, Addison Pam:1300]

我不知道如何将这些 Map 对象数据处理到 Map<Int, List<String>> .我做了这段代码,

Map<Integer, List<String>> result = persons.stream().map(nameNsalary)
.collect(Collectors.toMap(mapper -> (Integer)mapper.getKey(), mapper -> mapper.getValue()));

但是这段代码抛出如下异常

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
Type mismatch: cannot convert from Map<Object,Object> to Map<Integer,List<String>>
The method getKey() is undefined for the type Map<Integer,String>
The method getValue() is undefined for the type Map<Integer,String>

我坚持这个过程。

最佳答案

您的映射器效率很低,它会为每个条目创建一个新映射。

使用 groupingBy 会更简单集电极。

Map<Integer, List<String>> result = persons.stream()
.collect(Collectors.groupingBy(
p -> (p.getAge() / 10) * 10, // some integer division trick
Collectors.mapping(
p -> p.getFirstName() + " " + p.getLastName() +":" + p.getSalary(),
Collectors.toList()
)
));

哪个返回:

20 = [Tamsen Brittany:1500, Vere Hervey:1200, Maude Jaimie:1900, Clarette Cicely:1200, Tori Sheryl:1000, Rosalind Layla:1300, Quinn Tamara:1000]
40 = [Elsdon Jaycob:2000, Evonne Shari:1800]
30 = [Floyd Donny:1800, Sindy Jonie:1600, Shawn Randall:2300, Jayden Corrina:1700, Palmer Dene:2000, Addison Pam:1300, Jarrod Pace:1550, Victor Channing:1600, Osborne Shad:1100, Fraser Hewie:1100, Alvin Lance:1600]

您也可以放弃额外的映射步骤,并创建一个 Map<Integer, List<Person>>相反:

Map<Integer, List<Person>> result = persons.stream()
.collect(Collectors.groupingBy(p -> (p.getAge() / 10) * 10));

关于Java 8 流到 Map<Integer, List<String>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39594089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com