流中的通用chceck收集java

时间:2016-05-07 09:11:19

标签: java generics java-stream

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()返回的列表类型是否相同的地方?

2 个答案:

答案 0 :(得分:2)

Type inferencegenerics附带的强大工具。当您致电.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();})