【问题标题】:Java Lambda Iteration List from JPA [duplicate]JPA的Java Lambda迭代列表[重复]
【发布时间】:2014-04-23 16:30:57
【问题描述】:

我在 JPA 中使用 lambda 时发现了一些奇怪的行为,似乎 java 8 lambda 在从另一个对象获取列表时不会迭代。

例如:

    List<MyObject> list = anotherObject.getMyObjectList(); // Get The List

    list.foreach(myobject -> System.out.println("NOT PRINTED"));

    System.out.println("Size?: " + list.size()); // Print The Size = 2

我尝试使用 list.stream().foreach() 得到相同的结果..

经过几个小时的测试,我发现了一个窍门

    List<MyObject> copyList = new ArrayList<>(list); // copy The List 
    copyList.foreach(myobject -> System.out.println("OMG IS PRINTED!"));

嗯?有什么想法吗?,这是一个错误吗?还是我做错了什么? 我的实体类运行良好,所有关系都很好...... :)

在此先感谢 :)。

【问题讨论】:

  • 似乎List 代理没有像应有的那样拦截forEach 调用。
  • 在有效的示例中,我们知道列表是一个“ArrayList”。在不起作用的示例中,我们没有足够的信息来知道它是什么类型的对象。它是 List 的自定义实现吗?如果是这样,那么该错误很可能在该自定义实现中。
  • :P 是的 anotherObject.getMyObjectList();返回一个List,是同一个Object,不是list的自定义实现,是java.util.List,:P
  • java.util.List 是一个接口,而不是一个类。 getMyObjectList() 返回的具体列表类型是什么?
  • @DarkZaioN 执行System.out.println(list.getClass()) 以查找anotherObject.getMyObjectList() 返回的List 的具体类。

标签: java jpa lambda lazy-evaluation java-8


【解决方案1】:

最好知道anotherObject.getMyObjectList() 返回的List 的具体类。它的迭代器中可能有错误。

当您使用 new ArrayList&lt;&gt;(list) 将其复制到 ArrayList 时,此构造函数的代码会使用 toArray 从源列表中复制元素,然后将其复制到 ArrayList 中包含的新数组中。

当你调用list.forEach时,除非它被具体类覆盖,否则最终会调用Iterable的默认方法forEach,其实现是:

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

这只是一个标准的增强型for循环,没什么神奇的。但是这个 for 循环是根据列表的迭代器实现的。尝试编写一个 for 循环而不是调用 list.forEach(lambda),或者尝试调用 list.iterator(),看看你从中得到了多少元素。如果toArray 有效但迭代技术无效,这似乎是 JPA 列表类的迭代器实现中的一个错误。

【讨论】:

    【解决方案2】:

    更新你的 EclipseLink 版本,这个 bug 已经修复了!

    错误: https://bugs.eclipse.org/bugs/show_bug.cgi?id=433075

    更新到 2.6.0 或更高版本: http://mvnrepository.com/artifact/org.eclipse.persistence/eclipselink/2.6.0

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2016-06-03
      • 1970-01-01
      • 2018-04-26
      • 2018-10-10
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多