列出 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 Person
。 Person
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());
我有 List
个 class Person
。 Person
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());