List<String> namesOfMaleMembersCollect = roster
.stream()
.filter(p -> p.getGender() == Person.Sex.MALE)
.map(p -> p.getName())
.collect(Collectors.toList());
我有这样的代码,其中roster
被定义为List<Person>
。 JVM在哪个地方检查返回的List是否包含字符串?我的意思是我们已经定义了List,但是没有关于退休值字符串的信息。是这样的:
.map(p -> p.getName())
.collect(Collectors.toList());
JVM看到.map()
获取String并且知道.collect()
返回的列表类型是否相同的地方?
答案 0 :(得分:2)
Type inference是generics
附带的强大工具。当您致电.map(p -> p.getName())
时,它会返回Stream<String>
,现在Stream的类型参数为String而不是T
。
现在你调用collect,它带有以下签名的收集器。
<R, A> R collect(Collector<? super T, A, R> collector)
在Stream<String>
的情况下,它将被怀疑
Collector<String, ?, List<String>>
给我们List<String>
您可以将代码重写为以下内容
Collector<String, ?, List<String>> collector = Collectors.toList();
...map(p -> p.getName())
.collect(collector);
意味着从分配结果的变量类型中推断出类型。
答案 1 :(得分:0)
map方法返回在参数中应用函数的结果流,这样就会返回一个字符串流,然后我们使用收集器将结果收集为List。
在这个cas中它在这个map函数中:
map(p -> p.getName())
可以这样写(:
map(Person p -> {return p.getName();})