使用Java 8构造时Bean创建的ArrayOutOfBoundsException

当我使用Java 8function时,我在服务启动(Bean创建)上得到一个ArrayIndexOutOfBoundsException

Java 8已经建立并一直在运行。 代码编译正确。 在服务启动时,服务无法侦听端口,因为bean未创建。 当我更改代码(删除java 8构造)时,服务启动,一切正常。

这是我正在使用的代码(服务启动的工作代码):

 for (Item itemObject : response) { if (itemObject.hasId()) { idList.add(String.valueOf(itemObject.Id()); } } 

使用Java 8构造的相同代码:

 response.parallelStream() .filter(itemObject -> itemObject.hasId()) .map(itemObject -> itemObject.getId()) .forEach(id -> idList.add(id)); 

包含此代码的类的bean是使用组件扫描创建的。

当使用第二个代码块代替第一个代码块时,以下是exception消息:

 Exiting with throwable: java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace/.../GetContainerIdForFcSkuAdapter.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880 java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace....Some.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880 

对我来说没有意义的是,为什么在创建bean时会覆盖函数内部的代码(不是bean类的构造函数)。 我问这个,因为当我使用普通for循环而不是并行流时,exception不存在。 调用函数并实际使用此代码时, ArrayOutOfBoundsException出现ArrayOutOfBoundsException

我该如何解决?

你使用哪个版本的Spring? 您需要升级到Spring 4才能使用Java 8 lambda表达式。

我最近在使用Spring 3.0.5时发现了一个bug,它似乎在4.0.5中得到修复。 这是细节。

如果你有一个具有参数化构造函数的类,并且还有一个使用lambda表达式的方法(在Java 8中引入),那么在为该类创建bean时会发生ArrayIndexOutOfException。