过滤地图并返回键列表

时间:2019-12-12 05:30:43

标签: java list java-8 java-stream

我们有一个Map<String, Student> studentMap,其中Student是如下类:

class Student{
    String name;
    int age;
}

我们需要返回年龄在20岁以上的所有ID eligibleStudents的列表。
为什么以下内容在Collectors.toList处出现编译错误:

HashMap<String, Student> studentMap = getStudentMap();
eligibleStudents = studentMap .entrySet().stream()
        .filter(a -> a.getValue().getAge() > 20)
        .collect(Collectors.toList(Entry::getKey));

5 个答案:

答案 0 :(得分:6)

Collectors.toList()不接受任何参数,您需要首先map

eligibleStudents = studentMap.entrySet().stream()
    .filter(a -> a.getValue().getAge() > 20)
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());

答案 1 :(得分:5)

toList()收集器只是创建一个容器来累积元素,并且不接受任何参数。您需要先进行映射,然后再进行收集。看起来就是这样。

List<String> eligibleStudents = studentMap.entrySet().stream()
    .filter(a -> a.getValue().getAge() > 20)
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());

答案 2 :(得分:0)

filter之后,您将获得Student类型的流。对于过滤后的信息流中的每个学生,您都希望他/她的年龄。因此,您将必须对学生及其年龄进行一对一的映射。为此,请使用map运算符:

HashMap<String, Student> studentMap = getStudentMap();
            eligibleStudents = studentMap .entrySet().stream()
                    .filter(a->a.getValue().getAge()>20)
                    .map(a -> a.getKey())
                    .collect(Collectors.toList());

答案 3 :(得分:0)

解决方案中的问题是Collectors.toList()方法没有任何参数。请参阅下面的定义。

public static <T> Collector<T,?,List<T>> toList()

过滤器操作后,您将获得stream中的Entry<Id, Student>。 因此,您必须将Entry<Id, Student>转换为Id。 在以下解决方案中执行 map 后,您将拥有stream中的Id。 然后收集ID。

HashMap<String, Student> studentMap = getStudentMap();
List<Id> eligibleStudentIds = studentMap.entrySet().stream()
            .filter(s -> s.getValue().getAge()>20)
            .map(a -> a.getKey())
            .collect(Collectors.toList());

答案 4 :(得分:0)

我总是建议尝试在终端操作后调试一下。

Intellij Alt+Ctrl+V中有一项功能,可以告诉您操作后左侧的内容。

示例

当您具有以下代码时:

studentMap .entrySet().stream()
        .filter(a -> a.getValue().getAge() > 20)
        .collect(Collectors.toList());

全部选中并按Alt+Ctrl+V后,您将意识到此代码块返回List<Map.Entry<String,Integer>>

因此,现在您知道您的返回值不是String的List,现在您需要清除其他内容,并且仅接受其他String,为此,您将需要使用map

一旦您按照以下代码段进行映射:

studentMap .entrySet().stream()
                    .filter(a->a.getValue().getAge()>20)
                    .map(a -> a.getKey())
                    .collect(Collectors.toList());

现在,当您选择整个代码段并按Alt+Ctrl+V时,您将知道现在您正在获得实际的回报,即先前想要的回报,即List<String>

希望它可以在以后的编码中为您提供进一步的帮助。