Java 避免循环从集合中获取一列特定值<;实体>;在爪哇
我有一个Java代码片段,如下所示:Java 避免循环从集合中获取一列特定值<;实体>;在爪哇,java,performance,loops,for-loop,Java,Performance,Loops,For Loop,我有一个Java代码片段,如下所示: Set<BookDO> bookSet = shopDO.getBooks(); Collection<String> bookCollection = null; if (bookSet != null && !bookSet .isEmpty()) { bookCollection = new ArrayList<String>(); for (BookDO bo
Set<BookDO> bookSet = shopDO.getBooks();
Collection<String> bookCollection = null;
if (bookSet != null && !bookSet .isEmpty()) {
bookCollection = new ArrayList<String>();
for (BookDO book : bookSet) {
bookCollection .add(book.getName());
}
}
Set bookSet=shopDO.getBooks();
集合bookCollection=null;
if(bookSet!=null&&!bookSet.isEmpty()){
bookCollection=newarraylist();
for(bookdook:bookSet){
bookCollection.add(book.getName());
}
}
最后,我希望唯一的图书名称集合将其传递给显示输出的API
是否可以避免使用for循环来提高性能?您不必担心循环构造的性能。有一个JIT,它将在运行时优化事情 您有一套包含n元素的书籍。您希望检索每个集合项的属性;并将该值推送到列表中。如果不迭代整个集合,这是不可能的!你知道,为了触摸每个元素,你必须触摸每个元素 是的,使用java8流,可以以各种方式重写;您可能会获得一些性能,因为这将使编译器能够使用字节码指令(具有某些性能优势) 但最终:您无法绕过迭代该集合的所有条目 而真正的收获是:你只是假设你有一个性能问题。不要试图修复一些不真实的东西;直到它成为真正的问题。当然,如果该集合包含大量条目,那么您确实有一个真正的问题。但是你的问题仍然在错误的方向上;因为如果你在做“硬核”数据处理;你必须重新思考你的整个设计,以找到“扩展”的方法
警告:如果我们谈论的是量子计算,那么,疯狂的事情是可能的。但是我们不是。您不应该担心循环构造的性能。有一个JIT,它将在运行时优化事情 您有一套包含n元素的书籍。您希望检索每个集合项的属性;并将该值推送到列表中。如果不迭代整个集合,这是不可能的!你知道,为了触摸每个元素,你必须触摸每个元素 是的,使用java8流,可以以各种方式重写;您可能会获得一些性能,因为这将使编译器能够使用字节码指令(具有某些性能优势) 但最终:您无法绕过迭代该集合的所有条目 而真正的收获是:你只是假设你有一个性能问题。不要试图修复一些不真实的东西;直到它成为真正的问题。当然,如果该集合包含大量条目,那么您确实有一个真正的问题。但是你的问题仍然在错误的方向上;因为如果你在做“硬核”数据处理;你必须重新思考你的整个设计,以找到“扩展”的方法 警告:如果我们谈论的是量子计算,那么,疯狂的事情是可能的。但我们没有。很抱歉更新太晚: 不可能。在当前代码之外,这是不可能的(除了使用Java8特性来隐藏它之外) 如果
shopDO.getBooks()代码>代码在您手中您还有其他选择:
- 如果图书名称是唯一的,请使用Map而不是将Name设置为键。
然后,您的书名就直接从中取出来,名为
bookMap.keySet()
- 如果书名不唯一,您可以从
shopDO
two collections返回1<代码>设置
和列表
当您第一次填充设置
如果无法修改shopDo
代码,则没有选项 很抱歉更新太晚:
不可能。在当前代码之外,这是不可能的(除了使用Java8特性来隐藏它之外)
如果shopDO.getBooks()代码>代码在您手中您还有其他选择:
- 如果图书名称是唯一的,请使用Map而不是将Name设置为键。
然后,您的书名就直接从中取出来,名为
bookMap.keySet()
- 如果书名不唯一,您可以从
shopDO
two collections返回1<代码>设置
和列表
当您第一次填充设置
如果无法修改
shopDo
代码,则没有选项 这是不可能的,但您可以使用lambda表达式优化该代码
Set<BookDO> bookSet = [dataSorce]
Collection<String> bookCollection;
if (bookSet != null && bookSet.isEmpty()) {
bookCollection = new ArrayList<String>();
bookSet.forEach((book) -> {
bookCollection.add(book.getName());
});
}
Set bookSet=[dataSorce]
收藏书籍收藏;
if(bookSet!=null&&bookSet.isEmpty()){
bookCollection=newarraylist();
bookSet.forEach((书)->{
bookCollection.add(book.getName());
});
}
这是不可能的,但您可以使用lambda表达式优化该代码
Set<BookDO> bookSet = [dataSorce]
Collection<String> bookCollection;
if (bookSet != null && bookSet.isEmpty()) {
bookCollection = new ArrayList<String>();
bookSet.forEach((book) -> {
bookCollection.add(book.getName());
});
}
Set bookSet=[dataSorce]
收藏书籍收藏;
if(bookSet!=null&&bookSet.isEmpty()){
bookCollection=newarraylist();
bookSet.forEach((书)->{
bookCollection.add(book.getName());
});
}
如果Java8-使用lambdas。它们的编译方式不同,有利于JIT——这种构造将更快地发挥作用
Collection<String> bookCollection = bookSet.stream().map(BookDO::getName()).collect(toSet())
当使用以下名称时:
bookMap.values();
如果是Java8,则使用lambdas。它们的编译方式不同,有利于JIT——这种构造将更快地发挥作用
Collection<String> bookCollection = bookSet.stream().map(BookDO::getName()).collect(toSet())
当使用以下名称时:
bookMap.values();
正确的。它只是隐藏在不同语言级别的代码结构下。因此,这是一种“错觉”,即没有循环。:-)没问题。我只是打了个电话,我不太擅长。。。非常感谢,好的。它只是隐藏在不同语言级别的代码结构下。因此,这是一种“错觉”,即没有循环。:-)没问题