Java 返回对象集的方法,要存储为字符串列表

Java 返回对象集的方法,要存储为字符串列表,java,Java,我有两个班,Student和Book。 我想将student.getBook(将返回Set)返回的书名存储到List中 Student.java public class Student { private int id; private String bookName; //Setter and getter....... } public class Student { private int id; private String student N

我有两个班,
Student
Book
。 我想将
student.getBook(将返回Set)
返回的书名存储到
List

Student.java

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

public class Student {
    private int id;
    private String bookName;
    //Setter and getter.......
}
public class Student {
    private int id;
    private String student Name;
    private Set<Book> books;
    //Setters and Getters
}
公共班级学生{
私有int-id;
私有字符串学生姓名;
私人书籍;
//二传手和接球手
}
这里是主要的方法

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());
}
publicstaticvoidmain(字符串[]arg){
书b1=新书(1,“艺术”);
书b2=新书(2,“科学”);
书b3=新书(3,“生物”);
Set b=新的HashSet();
b、 添加(b1);
b、 添加(b2);
b、 添加(b3);
学生s=新生(1,“std1”,b);
//我想在这里储存书名
//进入列表,比如
列表簿=新
ArrayList(s.getBooks().getBookName());
}
请帮助….

由于
s.getBookNames()
返回
,您必须迭代集合以获取单个书籍的名称,然后将其保存到代码中名为
书籍
的另一个列表中:

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

第一个模型是用于
Book.java
而不是
Student.java

这就是流API的用武之地

要将一组书籍(
s.getBooks()
)直接转换为带有书籍名称的
列表
,只需
映射
收集

List<String> bookNames = s.getBooks().stream()
    .map(x -> x.getBookName())
    .collect(Collectors.toList())
List bookNames=s.getBooks().stream()
.map(x->x.getBookName())
.collect(收集器.toList())
这对你来说可能是新的,所以我会一点一点地解释


方法创建一个
。这样您就可以在
集合上执行一些很酷的操作,如
映射
减少
过滤
。然后我们
绘制
图书流<代码>映射
只是“变换”的另一个词。因为您只需要书名,所以我们将流中的每本书转换为其书名。
x->x.getBookName()
描述了我们想要如何转换它。它的意思是“给定一本书
x
,我们得到的书名是
x
”。最后,我们调用
collect
,它“收集”流中的所有内容,并将它们放回集合中。在这种情况下,我们需要一个
列表
,因此我们调用
toList()

,我发现您对学生的模态定义不好。您可以简单地定义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());
 }
}
公共班级学生{
私有int-id;
私有字符串名称;
私人书籍;
公立学生(整数id、字符串名称、集合b){
this.id=id;
this.name=名称;
本书=b;
}
//全是干将和二传手。
公共列表getBookNames(){
返回这个.getBooks().stream().map(x->x.getName()).collect(Collectors.toList());
}
}
如果您使用的是java1.8,正如sweeper建议的那样,您可以使用流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);
}
publicstaticvoidmain(字符串[]args){
书b1=新书(1,“艺术”);
书b2=新书(2,“科学”);
书b3=新书(3,“生物”);
Set b=新的HashSet();
b、 添加(b1);
b、 添加(b2);
b、 添加(b3);
学生s=新生(1,“std1”,b);
List books=s.getBookNames();
系统输出打印(书籍);
}

您有一套(即一套)书籍。你想要另一本书名集。因此,您需要创建一个空字符串列表,循环遍历这组书籍中的所有书籍,获取每本书的名称,并将其添加到列表中。当然,有一些较短的方法可以做到这一点,例如使用streams,但这是幕后发生的事情,在学习streams之前,你需要自己至少做一次。你不认为第一个模型应该是Book.java而不是Student.java吗?和
私有字符串学生姓名很奇怪!集合是要设置和列出的公共父级。也许你想要转换,不是吗reired@user8189926如果您认为我的答案回答您的问题,请考虑通过点击这个复选标记接受它!