【问题标题】:Java 8 Stream conversion of Array of Array of ClassJava 8 类数组数组的流转换
【发布时间】:2019-08-20 21:14:23
【问题描述】:

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

我有以下描述的学校、学科、出版商、书籍的 Pojos -

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

}

现在我的要求是创建一个数组,其中包含我拥有的 School 对象中的所有 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();
}

}

这可以使用 Java 8 流、收集器、映射来完成吗? 另外,如果我们只想获得奇数/偶数的书籍 ID?

【问题讨论】:

  • 是的,first.getSubjects(),stream,map,map,flatMap,map,collect :)
  • 我建议你使用Lists 而不是数组。

标签: java java-8 java-stream collectors


【解决方案1】:

是的,您需要flatMap 来实现这一目标

Stream.of(first.getSubjects())
    .map(Subject::getPublisher)
    .map(Publisher::getBooks)
    .flatMap(Arrays::stream)
    .map(Book::getBookId)
    .collect(Collectors.toList());

如果你想让它 null 安全你需要添加额外的过滤,比如

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

【讨论】:

  • 谢谢,另外,如果我们只想获取那些奇数/偶数的书籍 ID 吗?
  • 在 m.antkowicz 的回答中,你可能会得到重复的 ID,如果你想遵守这种情况,那么你应该在收集物品之前添加 distinct()。
  • 在将它们收集到列表之前添加正确的filter
  • 我还会使用Arrays.stream 来初始创建流,而不是Stream.of
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
相关资源
最近更新 更多