fold throws NPE when using parallel() variant on the collection
Brian Goetz
brian.goetz at oracle.com
Sat Oct 20 05:34:18 PDT 2012
You are passing a null where a lambda is expected. So NPE is the
correct behavior.
On 10/20/2012 4:44 AM, Arul Dhesiaseelan wrote:
> Hi,
>
> This code used to work before, but it fails with build 61 and with the
> latest sources. It works fine with stream, but not in parallel in the fold
> context.
>
> List<String> greetings = Arrays.asList("hello", "Hello");
> List<Tweet> tweets = new ArrayList<>();
> tweets.add(new Tweet("arul", "Aloha!", 2));
> tweets.add(new Tweet("joe", "Hello!", 16));
> tweets.add(new Tweet("matt", "Hola!", 78));
>
> List<Tweet> filtered = tweets.parallel().filter(t ->
> greetings.parallel().anyMatch(t.text::contains)).into(new
> ArrayList<Tweet>());//greetings.parallel() works
> List<Tweet> filtered2 = tweets.parallel().filter(tweet ->
> greetings.parallel().fold(() -> false, (Boolean b, String keyword) -> b ||
> tweet.text.contains(keyword), null)).into(new ArrayList<Tweet>());//
> greetings.parallel() fails with NPE when used with fold()
>
> Exception in thread "main" java.lang.NullPointerException
> at java.util.streams.ops.FoldOp$ReduceTask.onCompletion(FoldOp.java:123)
> at
> java.util.concurrent.CountedCompleter.tryComplete(CountedCompleter.java:389)
> at java.util.streams.ops.AbstractTask.compute(AbstractTask.java:101)
> at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:435)
> at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:263)
> at
> java.util.concurrent.ForkJoinPool$WorkQueue.runSubtask(ForkJoinPool.java:994)
> at
> java.util.concurrent.ForkJoinPool.tryHelpStealer(ForkJoinPool.java:1704)
> at java.util.concurrent.ForkJoinPool.awaitJoin(ForkJoinPool.java:1833)
> at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:345)
> at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:657)
> at java.util.concurrent.ForkJoinPool.invoke(ForkJoinPool.java:2196)
> at
> java.util.streams.AbstractPipeline$ParallelImplPipelineHelper.invoke(AbstractPipeline.java:263)
> at java.util.streams.ops.FoldOp.evaluateParallel(FoldOp.java:86)
> at
> java.util.streams.AbstractPipeline.evaluateParallel(AbstractPipeline.java:125)
> at
> java.util.streams.AbstractPipeline.evaluateParallel(AbstractPipeline.java:113)
> at java.util.streams.AbstractPipeline.evaluate(AbstractPipeline.java:87)
> at
> java.util.streams.AbstractPipeline.pipeline(AbstractPipeline.java:298)
> at java.util.streams.ValuePipeline.fold(ValuePipeline.java:189)
> at FilterTest$2.test(FilterTest.java:25)
> at FilterTest$2.test(FilterTest.java:1)
> at java.util.streams.ops.FilterOp$1.accept(FilterOp.java:62)
> at java.util.streams.Streams$ArraySpliterator.into(Streams.java:711)
> at
> java.util.streams.ParallelPipelineHelper.into(ParallelPipelineHelper.java:57)
> at
> java.util.streams.AbstractPipeline$ParallelImplPipelineHelper.into(AbstractPipeline.java)
> at
> java.util.streams.ops.TreeUtils$CollectorTask.doLeaf(TreeUtils.java:120)
> at
> java.util.streams.ops.TreeUtils$CollectorTask.doLeaf(TreeUtils.java:98)
> at java.util.streams.ops.AbstractTask.compute(AbstractTask.java:100)
> at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:435)
> at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:263)
> at
> java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
> at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
> at
> java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
>
> -Arul
>
More information about the lambda-dev
mailing list