首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8类数组的流转换

Java 8类数组的流转换
EN

Stack Overflow用户
提问于 2019-08-20 21:14:23
回答 1查看 1.4K关注 0票数 2

我是Java 8的新手。我需要使用以下方法在Java 8中创建一个String数组:

我有学校,学科,出版者,书,如下所述-

代码语言:javascript
复制
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;
    }

}

现在,我的要求是制作一个数组,它包含来自我所拥有的学校对象的所有bookIds。下面的java代码是必需的代码。

代码语言:javascript
复制
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();
}

}

这可以使用Java 8流、收集器、映射来完成吗?另外,如果我们只想得到那些奇数/偶数的图书if呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-20 21:19:23

是的-你需要一个flatMap来实现这一点。

代码语言:javascript
复制
Stream.of(first.getSubjects())
    .map(Subject::getPublisher)
    .map(Publisher::getBooks)
    .flatMap(Arrays::stream)
    .map(Book::getBookId)
    .collect(Collectors.toList());

如果您希望使其为空安全,则需要添加其他筛选,如

代码语言:javascript
复制
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());
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57581607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档