2017-09-02 44 views
0

我有兩個類,StudentBook。 我想將student.getBook(that will return Set<Book>)返回的書名存儲到List<String>返回一組對象的方法,要存儲爲字符串列表

Student.java

public class Student { 
    private int id; 
    private String bookName; 
    //Setter and getter....... 
} 

Student.java

public class Student { 
    private int id; 
    private String student Name; 
    private Set<Book> books; 
    //Setters and Getters 
} 

這裏是主要方法

public static void main(String[] arg){ 
    Book b1= new Book(1, "art"); 
    Book b2= new Book(2, "science"); 
    Book b3= new Book(3, "bio"); 
    Set<Book> b=new HashSet<>(); 
    b.add(b1); 
    b.add(b2); 
    b.add(b3); 
    Student s=new Student (1, "std1",b); 
    //here I want to store bookName 
    //into List, some thing like 
    List<String> book=new 
    ArrayList<>(s.getBooks().getBookName()); 
} 

請幫助.....

+0

你有一套書(即一個集合)。你想要另一個書名的集合。所以你需要創建一個空的字符串列表,循環遍歷書中的所有書籍,獲取每本書的名稱,並將其添加到列表中。當然,有更短的方法可以做到這一點,例如使用流,但是發生在幕後的事情,並且您需要在學習流之前至少自己做一次。 –

+0

另外你不覺得第一個模型應該是Book.java而不是Student.java?和'私人絃樂學生名字'是奇怪的! – nullpointer

+0

收藏是設置和列表的常見父項。也許轉換你想要的,tottalyy沒有reired –

回答

0

由於s.getBookNames()返回Set<Book>,你必須遍歷集合去取個人本書的名字,然後將其保存到你的代碼中的另一個列表命名爲book

List<String> bookNames = new ArrayList<>(); // initialize a list for all the book names 
s.getBooks().forEach(book -> bookNames.add(book.getBookName())); // iterate all the books and add their names to the above list 

而且,這種假設幾個明顯事情指出在意見爲好,

private String student Name; // this variable either named as 'student or `name` or `studentName` 

與第一種模式是爲Book.java,而不是Student.java

1

這就是Stream API派上用場的地方!

要將一套書(s.getBooks())直接轉換成書名爲List<String>,您只需要mapcollect

List<String> bookNames = s.getBooks().stream() 
    .map(x -> x.getBookName()) 
    .collect(Collectors.toList()) 

這對你來說可能看起來很新,所以我會一點一點解釋它。

stream方法創建一個Stream<Book>。這樣,您就可以在Set上執行很酷的操作,例如map,reducefilter。然後我們map的書籍流。 map只是「變換」的另一個詞。由於您只需要書名,因此我們將流中的每本書都轉換爲書名。 x -> x.getBookName()描述了我們如何改變它。這意味着「給定一本書x,我們得到書名x」。最後,我們調用collect,它「收集」流中的所有內容並將它們放回集合中。在這種情況下,我們需要一個List,所以我們稱之爲toList()

+0

@ user8189926如果你認爲我的答案回答你的問題,請考慮接受它通過點擊該選中標記! – Sweeper

0

有些地方,我看到你的學生的模態定義不好。只需按照以下步驟定義學生模式即可。

並在Student類中創建一個單獨的公共方法來獲取書名。

public class Student { 
    private int id; 
    private String name; 
    private Set<Book> books; 

    public Student(int id, String name, Set<Book> b) { 
     this.id = id; 
     this.name = name; 
     this.books = b; 
    } 
// all getter and setter. 

public List<String> getBookNames(){ 
    return this.getBooks().stream().map(x -> x.getName()).collect(Collectors.toList()); 
} 
} 

如果您使用的是java1.8,因爲sweeper建議您可以使用stream api來完成您的工作。

public static void main(String[] args) { 
    Book b1 = new Book(1, "art"); 
    Book b2 = new Book(2, "science"); 
    Book b3 = new Book(3, "bio"); 
    Set<Book> b = new HashSet<>(); 
    b.add(b1); 
    b.add(b2); 
    b.add(b3); 
    Student s = new Student(1, "std1", b); 
    List<String> books = s.getBookNames(); 
    System.out.println(books); 
} 
相關問題