列出 stream().map() 不存在类型变量 R 的实例,因此 Stream<R> 符合 List<String>

Lists stream().map() no instance(s) of type variable(s) R exist so that Stream<R> conforms to List<String>

我有 List 个 class PersonPerson class 看起来像这样:

public class Person {

    int id;
    String username;
    double balance;
    String gender;
    boolean isPersonWorking;

    // All-args constructor, getters and setters omitted for brevity
}

下面是我如何声明和初始化我的 List<Person>:

List<Person> personsList = new ArrayList<>();
personsList.add(new Person(1, "James", 300, "Male", true));
personsList.add(new Person(2, "Jane", 500, "Female", false));
personsList.add(new Person(3, "Valjakudze", 900, "Male", false));
personsList.add(new Person(4, "Laika", 1200, "Female", true));

我想要实现的是使用 Java 流 API 获取所有用户名的 List<String>,但不使用 for 循环。

以下是我尝试实现的方法:

List<String> personsNamesUsingStream = new ArrayList<>();
personsNamesUsingStream = personsList.stream()
    .map(person -> person.getUsername());

但是我遇到了以下错误

Required type: List<String> Provided: Stream<Object>
no instance(s) of type variable(s) R exist so that Stream<R> conforms to List<String>`

tl;博士

您忘记从流中生成列表。

List.of(
    new Person( 1 , "Alice" ) ,
    new Person( 2 , "Bob" ) ,
    new Person( 3 , "Carol" ) 
)
.stream()
.map( Person :: name )
.toList()  //  Collect output of stream into a list.

主要问题

您没有将映射对象收集到流中。在 .map 调用后添加 toList()

其他问题

无需初始化结果数组。流正在生成自己的列表,以替换您创建的列表。所以这个:

List<String> personsNamesUsingStream = new ArrayList<>();
personsNamesUsingStream = personsList.stream().map …

…应该折叠成一行。

List<String> personsNamesUsingStream = personsList.stream().map …

另一个问题:我们可以通过使用方法引用来简化您的 map 调用。

.map( Person :: getUsername )

示例代码

这是一些未经测试的代码的草稿。

为简洁起见,在这里我们将自定义 class 声明为 record

record Person( int id , String name ) {}
List< Person > persons = 
    List.of(
        new Person( 1 , "Alice" ) ,
        new Person( 2 , "Bob" ) ,
        new Person( 3 , "Carol" ) 
    );

List< String > names = 
    persons
        .stream()
        .map( Person :: name )
        .toList() ;

在Java16之前,将toList()替换为.collect( Collectors.toUnmodifiableList() )。在Java10之前,.collect( Collectors.toList() ).

您的问题在这里:

personsNamesUsingStream = personsList.stream().map(person -> person.getUsername());

.map() 的结果是一个对象流,确切地说它是一个字符串流,并且您的引用 personsNamesUsingStream 来自类型 List<String>,因此您不能分配结果.map() 到 List 中的引用。

解决方案是将 String 流的元素存储到 ArrayList<String> 中,这样您就可以使用参考 personsNamesUsingStream .

代码更正:

personsNamesUsingStream = personsList.stream().map(Person::getUsername).collect(Collectors.toList());