2017-09-02 5 views
0

私は2つのクラス、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 
} 

助けてくださいmainメソッド

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

あなたには書籍のセット(コレクション)があります。別の書籍名のコレクションが必要です。したがって、空の文字列リストを作成し、ブックセット内のすべてのブックをループし、各ブックの名前を取得してリストに追加する必要があります。もちろん、ストリームを使用するなど、ストリームを使用する方法は短期間でありますが、その背後では何が起こるのですか。ストリームを学習する前に、少なくとも1回は自分で行う必要があります。 –

+0

また、最初のモデルはStudent.javaではなくBook.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>を作成します。これはmapreducefilterのようなクールな操作をSetに実行できるようにするためです。その後、我々は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()); 
} 
} 

スイーパーはあなたの仕事をするために、ストリームAPIを使用することができます示唆したように、あなたは、java1.8を使用している場合。

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); 
}