Java Guava:从包含变量的对象列表中获取变量列表

Java Guava:从包含变量的对象列表中获取变量列表,java,list,guava,Java,List,Guava,这个想法: 我有一个目标 public class Book(){ private String name; private Integer nbOfPage; public Book() ... } 我得到了这个物体的清单 List<Book> books = new ArrayList<Book>(); List books=new ArrayList(); 现在我想知道,在番石榴园或其他图书馆里,是否有一种快速的方法可以从我得到的所有书籍中获得

这个想法:

我有一个目标

public class Book(){
  private String name;
  private Integer nbOfPage;
  public Book()
  ...
}
我得到了这个物体的清单

List<Book> books = new ArrayList<Book>();
List books=new ArrayList();
现在我想知道,在番石榴园或其他图书馆里,是否有一种快速的方法可以从我得到的所有书籍中获得所有不同名称的列表,我可以做些什么:

List<String> names = new ArrayList<String>();
for (Book aBook : books){
   if (!names.contains(aBook.getName()){
        names.add(aBook.getName());
   }
}
List name=new ArrayList();
对于(书籍A:书籍){
如果(!names.contains(aBook.getName()){
name.add(aBook.getName());
}
}
我觉得这种方式有点“重”,我的书单可以有200到1200本书

关于,

对图书名称集合使用(如HashSet),这样您就不必每次都检查您是否已经拥有当前图书名称。您可以在HashSet中插入固定时间的元素,并且不会有重复项。请确保您有一个好的hashCode()方法和相应的equals,请参见以下内容:

不存在更快的解决方案,因为您必须至少在所有书籍上迭代一次。

使用番石榴。它完全符合您的预期

List<Book> books = ...

Function<Book,String> bookToName = new Function<Book,String>() {
  String apply(Book b) { return b.getName(); }
}

Multimap<String,Book> booksByName = Multimaps.index(books, bookToName);
列出书籍=。。。
函数bookToName=新函数(){
字符串apply(Book b){return b.getName();}
}
Multimap booksByName=Multimaps.index(图书,BookTonName);

然后,如果您只需要名称,就可以使用您的
多地图
,如
booksByName.keys()

问题是什么?嗯,我想这不是“第一个好的改进”,但你所能做的一切。你不可能比这更快……嗯……我承认我没有正确地阅读这个问题。虽然这回答了问题,但更好的解决方案是使用
Iterables.transform()