Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java .forEach和.sort don';无法工作,无法在块中设置断点_Java_Jpa_Collections_Java 8_Java Stream - Fatal编程技术网

Java .forEach和.sort don';无法工作,无法在块中设置断点

Java .forEach和.sort don';无法工作,无法在块中设置断点,java,jpa,collections,java-8,java-stream,Java,Jpa,Collections,Java 8,Java Stream,我正在使用Java8(Build1.8.025)、NetBeans8.0.2,并且正在将Java8的一些功能合并到现有的应用程序中。排序和.forEach不起作用,所以我创建了一些测试代码,以确保我理解lambdas等,并诊断问题。以下是新代码以及与我的系统中的数据交互的代码的混合: public void test(Registration reg) { /* new code */ List<String> family = new ArrayList<>

我正在使用Java8(Build1.8.025)、NetBeans8.0.2,并且正在将Java8的一些功能合并到现有的应用程序中。排序和.forEach不起作用,所以我创建了一些测试代码,以确保我理解lambdas等,并诊断问题。以下是新代码以及与我的系统中的数据交互的代码的混合:

  public void test(Registration reg) {
/* new code */
    List<String> family = new ArrayList<>();
    family.add("Mom");
    family.add("Dad");
    family.add("Brother");
    family.add("Sister");

    family.forEach(p -> System.out.println(p));

    Collections.sort(family, (p1,p2) -> {
        System.out.println(p1 + " <==> "+ p2);
        return p1.compareToIgnoreCase(p2);
            });

    family.forEach(p -> System.out.println(p));

/* code to test with my system data */
    List<RegistrationItem> item = new ArrayList<>();
    List<RegistrationItem> regI = reg.getRegistrationItem();

    regI.forEach(p -> {
        System.out.println(p.toString());
        item.add(p);
            });

    Collections.sort(regI, (r1,r2) -> {
        System.out.println(r1.toString() + r2.toString());
        return r1.getId().compareTo(r2.getId());
    });

    for (RegistrationItem r : regI) {
            item.add(r);
    }
}
公共无效测试(注册登记){
/*新代码*/
列表族=新的ArrayList();
家庭。添加(“母亲”);
家庭。加上(“爸爸”);
家庭。加上(“兄弟”);
家庭。添加(“姐妹”);
family.forEach(p->System.out.println(p));
集合.排序(系列,(p1,p2)->{
系统输出打印项次(p1+“”+p2);
返回p1.compareToIgnoreCase(p2);
});
family.forEach(p->System.out.println(p));
/*用我的系统数据测试的代码*/
列表项=新建ArrayList();
List regI=reg.getRegistrationItem();
forEach地区(p->{
System.out.println(p.toString());
项目.增加(p);
});
Collections.sort(regI,(r1,r2)->{
System.out.println(r1.toString()+r2.toString());
返回r1.getId().compareTo(r2.getId());
});
用于(注册项目r:regI){
项目.添加(r);
}
}
注册是反映事件数据的POJO,其中包括注册项列表,该列表是另一个POJO的详细信息。在本测试中,列表大小为4

标有“新代码”的部分工作正常。它打印列表,在排序时打印,然后打印排序后的列表。我还可以在排序的块内设置断点,这是我所期望的

使用现有代码是另一回事。.forEach和.sort不起作用,我无法在Java8块中设置断点。调试器会逐步执行代码,但似乎不会执行。当我进入for循环时,“item”的大小仍然是0。这里的外观只是为了证明数据可以按照预期的方式移动,结果是大小为4

任何帮助都将不胜感激


对不起,我可能不清楚。这只是一个测试代码,演示了自从改用Java8以来我在许多地方遇到的一个问题。比较器已更改为lambdas,for循环更改为.forEach,但均不起作用。此代码除了用于此发布之外没有其他用途

在这个例子中,我已经验证了reg被正确地传递给测试方法。它的结构正确,regI的大小为4,对象结构正确

  • 新的数组列表“item”只是为.forEach测试提供了一个简单的容器
  • .forEach将使用一块代码进行测试并设置断点。它不起作用
  • .sort用于对同一容器中的列表重新排序。我没有使用流,因为我不想移动它。它不起作用
  • for循环是为了证明列表具有有效数据以及.forEach的意图应该有效的旧方式。它确实像预期的那样工作
我假设我的环境或代码有问题,但我自己无法识别


在使用Holger和Stuart Marks建议的方法进行测试之后,很明显,这与间接列表和覆盖相关的问题是相同的。我的JRE和JDK都是Java8,我已经升级到EclipseLink 2.5.2。我已经用comparator、Collections.sort with lambdas和.forEach证明了这个问题100%都会发生。这似乎是一个非常普遍的问题,我很惊讶,除了我的问题外,另一个问题没有引起更多的关注。

尝试改变处理列表的方式。如果要获取列表中的项目,请对其进行排序,然后将其分配给新列表,然后尝试以下操作:

List<RegistrationItem> sortedItems = reg.getRegistrationItem().stream()
    .sorted((a, b)-> a.getId().compareTo(b.getId()))
    .peek(System.out::println)
    .collect(Collectors.toList());

这个问题的根本原因是在EclipseLink JPA的
间接列表
类中使用了有缺陷的实现模式。(,)此问题发生在2.5版本系列中;它也可能出现在其他版本中

问题是这个类既是
Vector
的子类,又有一个对
Vector
实例的引用。它试图通过覆盖
Vector
的所有方法,将所有方法调用委托给该实例。只要不向
Vector
添加新方法,这种方法就可以正常工作

这发生在Java8中

Java 8向
集合
Iterable
列表
接口添加了几个新的默认方法,包括:

  • forEach
  • parallelStream
  • removeIf
  • replaceAll
  • 排序
  • spliterator
通常,添加默认方法是安全的,因为它们必须根据其他现有方法来实现。然而,为了提高效率,实现类来覆盖默认方法通常是一个好主意。Java8
Vector
实现添加了对这些默认方法的几个重写。如果您有一个实际的
Vector
类的实例,这些方法可以很好地工作。
IndirectList
类不会覆盖这些方法,因此它试图设置的委托路径对这些方法无效。相反,使用普通的
向量
实现。不幸的是,
IndirectList
方法不能使超类状态保持最新,因此这些方法的
Vector
实现的行为就好像
Vector
是空的一样

Vector
覆盖
forEach
removeIf
replaceAll
排序
,和
拆分器
parallelStream
stream
默认方法是根据
spliterator
实现的,因此同样的事情也发生在它们身上。从本质上说,没有一个新的德福
    List<RegistrationItem> item = regI.stream()
        .sorted(Comparator.nullsFirst(
            Comparator.comparing(RegistrationItem::getId,
                Comparator.nullsFirst(String::compareTo))))
        .peek(System.out::println)
        .collect(Collectors.toList());