【问题标题】:Avoid looping to get one particular column of values from Set<Entity> in Java避免循环从 Java 中的 Set<Entity> 获取特定列的值
【发布时间】:2017-03-31 12:26:38
【问题描述】:

我有一个Java代码sn-p如下:

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());
      }
    }

最后,我希望将唯一的书名集合传递给显示输出的 API。

是否可以避免for循环来提高性能?

【问题讨论】:

    标签: java performance loops for-loop


    【解决方案1】:

    您不必担心循环结构的性能。有一个 JIT,它将在运行时优化事物。

    您有一套书,其中包含 n 个元素。您想检索每个集合条目的属性;并将该值推送到列表中。如果没有以某种方式迭代整个集合,那根本不可能!你知道,为了触摸每个元素,你必须触摸每个元素。

    是的,使用 java8 流,这可以用各种方式重写;并且您可能获得一点性能,因为这将使编译器能够使用invokedynamic 字节码指令(具有一定的性能优势)。

    但最后:您无法绕过该集合的所有条目的迭代。

    真正的收获是:您只是假设您有性能问题。不要试图修复不真实的东西;直到它成为一个真正的问题。当然,如果该集合包含大量条目,那么您确实遇到了真正的问题。但是,您的问题仍然朝着错误的方向发展;因为如果您正在进行“核心”数据处理;您将不得不重新考虑您的完整设计以找到“扩展”的方法。

    警告:如果我们要谈论量子计算和Grover search,那么,好吧,疯狂的事情是可能的。但我们不是。

    【讨论】:

      【解决方案2】:

      抱歉更新晚了:

      没有。不可能直接从当前代码中取出(除了使用 Java 8 特性来隐藏它)

      如果shopDO.getBooks(); 代码在您手中,您还有其他选择:

      • 如果书名是唯一的,则使用 Map 而不是 Set,并将 Name 作为键。 那么你的书名就是bookMap.keySet()
      • 如果书名不是唯一的,您可以从 shopDO 两个集合返回 1. Set&lt;BookDO&gt;List&lt;String&gt; 在您第一次填充时同时填充的名称 Set

      如果您无法修改shopDo 代码,则没有选项。

      【讨论】:

      • 对。它只是隐藏在不同的语言级别代码结构下。因此,没有循环是一种“错觉”。 :-)
      • 没问题。我刚用手机打字,我不擅长...非常感谢。
      【解决方案3】:

      这是不可能的,但您可以使用 lambda 表达式优化该代码

      Set<BookDO> bookSet = [dataSorce]
      Collection<String> bookCollection;
      if (bookSet != null && bookSet.isEmpty()) {
          bookCollection = new ArrayList<String>();
          bookSet.forEach((book) -> {
              bookCollection.add(book.getName());
          });
      }
      

      【讨论】:

        【解决方案4】:

        如果是 Java8 - 使用 lambda。它们的编译方式不同并且有利于 JIT - 这种构造会更快。

        Collection<String> bookCollection = bookSet.stream().map(BookDO::getName()).collect(toSet())
        

        如果集合没有变化,您也可以存储地图而不是集合。 bookMap = 新的 HashMap 您只需创建一次映射(HasSet 在其实现中使用 HashMap,因此不会出现性能或内存问题)。当您需要获取书籍时,请致电:

        bookMap.keySet();
        

        当名字时:

        bookMap.values();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-05
          • 1970-01-01
          • 2020-11-09
          • 1970-01-01
          • 1970-01-01
          • 2020-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多