java - 从另一个列表的子属性创建一个列表

时间:2016-11-05 16:38:07

标签: java java-8

我有三个用getter和setter定义的类,如下所示:ORM:

class Author {
  Integer id;
  String name;
}

class BookAuthor {
  Integer id_book;
  Author author;
}

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

我想从Book类创建一个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());

谢谢。

3 个答案:

答案 0 :(得分:1)

我假设authors变量是BookAuthor的列表(或集合),而不是作者(基于您的代码看起来像是这样)。

我认为你有正确的想法,我不认为你可以链接::运营商。

所以尝试使用lambda:

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

答案 1 :(得分: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());
}
}

答案 2 :(得分:0)

您不能像这样链接方法引用。但您可以使用map功能两次:

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