Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8类数组的数组流转换_Java_Java 8_Java Stream_Collectors - Fatal编程技术网

Java 8类数组的数组流转换

Java 8类数组的数组流转换,java,java-8,java-stream,collectors,Java,Java 8,Java Stream,Collectors,我不熟悉Java8。我需要使用以下方法在Java 8中创建字符串数组: 我拥有如下所述的学校、学科、出版商和书籍的POJO- public class School { private Subject[] subjects; public Subject[] getSubjects() { return subjects; } public void setSubjects(Subject[] subjects) { thi

我不熟悉Java8。我需要使用以下方法在Java 8中创建字符串数组:

我拥有如下所述的学校、学科、出版商和书籍的POJO-

public class School {
    private Subject[] subjects;

    public Subject[] getSubjects() {
         return subjects;
    }

    public void setSubjects(Subject[] subjects) {
         this.subjects = subjects;
    }
}

public class Subject {
    private String subjectName;
    private String subjectId;
    private Publisher publisher;

    public String getSubjectName() {
        return subjectName;
    }

    public void setSubjectName(String subjectName) {
        this.subjectName = subjectName;
    }

    public String getSubjectId() {
        return subjectId;
    }

    public void setSubjectId(String subjectId) {
        this.subjectId = subjectId;
    }

    public Publisher getpublisher() {
        return publisher;
    }

    public void setPublisher(Publisher publisher) {
        this.publisher = publisher;
    }
}

public class Publisher{
    private String name;
    private String sinNo;
    private Book[] books;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSinNo() {
        return sinNo;
    }

    public void setSinNo(String sinNo) {
        this.sinNo = sinNo;
    }

    public Book[] getBooks() {
        return books;
    }

    public void setBooks(Book[] books) {
        this.books = books;
    }
}

public class Book {
    private String bookName;
    private String bookId;

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getBookId() {
        return bookId;
    }

    public void setBookId(String bookId) {
        this.bookId = bookId;
    }

}
现在,我的任务是创建一个数组,其中包含我拥有的学校对象的所有bookid。下面的旧java代码是必需的代码

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    School first = <<School Object>>;
    for(Subject sub : first.getSubjects()){
        Publisher p = sub.getpublisher();
        for(Book b : p.getBooks()) {
            list.add(b.getBookId());
        }

        }
    //desired result
    String[] bookIds = (String[]) list.toArray();
}
publicstaticvoidmain(字符串[]args){
列表=新的ArrayList();
学校优先=;
for(Subject sub:first.getSubjects()){
Publisher p=sub.getpublisher();
for(Book b:p.getBooks()){
添加(b.getBookId());
}
}
//期望结果
String[]bookIds=(String[])list.toArray();
}
}

这可以通过Java8流、收集器和映射来实现吗? 另外,如果我们只想得到那些奇数/偶数的图书ID

是的,你需要一个团队来实现这一点

Stream.of(first.getSubjects())
    .map(Subject::getPublisher)
    .map(Publisher::getBooks)
    .flatMap(Arrays::stream)
    .map(Book::getBookId)
    .collect(Collectors.toList());
如果你想让它空安全,你需要添加额外的过滤,如

List<String> collect = Stream.of(first.getSubjects())
    .map(Subject::getPublisher)
    .filter(Objects::nonNull) // filter all null publishers
    .map(Publisher::getBooks)
    .filter(Objects::nonNull) // filter all null book lists
    .flatMap(Arrays::stream)
    .map(Book::getBookId)
    .filter(Objects::nonNull) // filter all null book ids
    .collect(Collectors.toList());
List collect=Stream.of(first.getSubjects())
.map(主题::getPublisher)
.filter(Objects::nonNull)//筛选所有空发布服务器
.map(Publisher::getBooks)
.filter(Objects::nonNull)//筛选所有空的图书列表
.flatMap(数组::流)
.map(Book::getBookId)
.filter(Objects::nonNull)//筛选所有空的图书ID
.collect(Collectors.toList());

Yes,first.getSubjects(),stream,map,map,flatMap,map,collect:)我建议您使用
List
s而不是数组。谢谢,另外,如果我们只想得到奇偶图书ID,在m.antkowicz的回答中,您可能会得到duplucate ID,如果您想遵守这种情况,那么您应该添加distinct()在收集项目之前。只需在将项目收集到列表之前添加适当的
过滤器
。我还将使用
数组.stream
来初始创建流,而不是
stream.of