我正在List上課Person。該類Person如下所示:
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));
我想要實作的是List<String>使用 Java Stream API 獲取所有用戶名,但不使用 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>`
uj5u.com熱心網友回復:
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.
主要問題
您沒有將映射物件收集到流中。toList()通話后添加.map。
其他問題
無需初始化結果陣列。該流正在生成自己的串列,以替換您創建的串列。所以這:
List<String> personsNamesUsingStream = new ArrayList<>();
personsNamesUsingStream = personsList.stream().map …
……應該折疊成一行。
List<String> personsNamesUsingStream = personsList.stream().map …
另一個問題:我們可以map通過使用方法參考來簡化您的呼叫。
.map( Person :: getUsername )
示例代碼
這是一些未經測驗的代碼的粗略草稿。
為簡潔起見,這里我們將自定義類宣告為記錄。
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() ;
在 Java 16 之前,替換toList()為.collect( Collectors.toUnmodifiableList() ). 在 Java 10 之前,.collect( Collectors.toList() ).
uj5u.com熱心網友回復:
你的問題在這里:
personsNamesUsingStream = personsList.stream().map(person -> person.getUsername());
的結果.map()是一個 Objects 流,確切地說它是一個字串流,并且您的參考personsNamesUsingStream來自型別 List<String>,因此您不能將結果分配.map()給 List 的參考。
解決方案是將您的流的元素存盤String到一個ArrayList<String>您可以使用您的參考personsNamesUsingStream 。
代碼更正:
personsNamesUsingStream = personsList.stream().map(Person::getUsername).collect(Collectors.toList());
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/444349.html
