我们有一个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));
答案 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>
。
希望它可以在以后的编码中为您提供进一步的帮助。