[英]Java 8 Stream conversion of Array of Array of Class
我是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對象的所有bookIds。 下面的舊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流,收集器,映射來完成此操作嗎? 另外,如果我們只想獲得奇/偶的書號?
是的-您需要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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.