2016-11-05 62 views
-2

我有自己的getter和setter方法定義的三類子屬性列表由ORM如下:爪哇 - 創建從另一個列表中

class Author { 
    Integer id; 
    String name; 
} 

class BookAuthor { 
    Integer id_book; 
    Author author; 
} 

class Book { 
    String title; 
    List<BookAuthor> authors; 
} 

我想從類書創建id_author列表。 我發現一種方法是使用流。我試過這個:

List<Integer> result = authors.stream().map(BookAuthor::getAuthor::getId).collect(Collectors.toList()); 

但它似乎沒有工作。 我可以訪問Author類中的「id」屬性嗎?

編輯: 也許辦法是:

List<Author> authorList = authors.stream().map(BookAuthor::getAuthor).collect(Collectors.toList()); 
List<Integer> result = authorList.stream().map(Author::getId).collect(Collectors.toList()); 

謝謝。

回答

1

我假定authors變量是BookAuthor的列表(或集合),而不是作者(它看起來像基於您的代碼)。

我認爲你有正確的想法,我只是不認爲你可以連鎖::運營商。

因此,與拉姆達嘗試:

authors.stream(). 
    map(ba -> ba.getAuthor().getId()). 
    collect(Collectors.toList()); 
+0

我缺少的是什麼BA這裏 – Alex

+0

@Alex其BOOKAUTHOR的實例。它表示您將要映射的流的特定元素。如果你願意,你可以寫BookAuthor ba,但是你不必像Java那樣推斷它。 – Zyga

0
public class Example { 
public static void main(String[] args) { 
    Book book1 = new Book(); book1.authors = new ArrayList<BookAuthor>(); 
    Author author1 = new Author(); author1.id = 5; 
    BookAuthor bookAuthor1 = new BookAuthor(); bookAuthor1.author = author1; 
    book1.authors.add(bookAuthor1); 
    List<Integer> idList = book1.authors.stream().map(ba -> ba.author.id).collect(Collectors.toList()); 
} 
} 
+0

生產類別當然應該有構造函數,封裝等 –

0

你不能像這樣的連鎖方法參考。但是你可以使用map函數兩次:

authors.stream() 
    .map(BookAuthor::getAuthor) 
    .map(Author::getId) 
    .collect(Collectors.toList());