为什么 Java 8 流 forEach 循环在使用 sorted() 方法后重复结果

在使用字谜的练习中,我发现执行后的代码在输出中有重复项,具体取决于类中方法的使用时刻。sorted()Stream


当我在做排序之前和方法filter()forEach()


        words.stream()

                .sorted()

                .filter(s1 -> !alreadyFound.contains(s1) && words.stream()

                        .filter(s2 -> isAnagram.apply(s1, s2))

                        .count() == maxAnagrams)

                .forEach(s1 -> {

它给出了这些结果:


 abel able bale bela elba

 alger glare lager large regal

 angel angle galen glean lange

 caret carte cater crate trace

 elan lane lean lena neal

 evil levi live veil vile

但是当我使用方法之后和之前的方法时sorted()filter()forEach()


        words.stream()

                .filter(s1 -> !alreadyFound.contains(s1) && words.stream()

                        .filter(s2 -> isAnagram.apply(s1, s2))

                        .count() == maxAnagrams)

                .sorted()

然后它给出了这些结果:


 abel able bale bela elba

 abel able bale bela elba

 alger glare lager large regal

 angel angle galen glean lange

 angel angle galen glean lange

 abel able bale bela elba

 abel able bale bela elba

 caret carte cater crate trace

 caret carte cater crate trace

 caret carte cater crate trace

 caret carte cater crate trace

 elan lane lean lena neal

 abel able bale bela elba

 evil levi live veil vile

 angel angle galen glean lange

 alger glare lager large regal

 angel angle galen glean lange

 alger glare lager large regal

 elan lane lean lena neal

 angel angle galen glean lange

 alger glare lager large regal

 elan lane lean lena neal

 elan lane lean lena neal

 evil levi live veil vile

 evil levi live veil vile

 elan lane lean lena neal

 alger glare lager large regal

 caret carte cater crate trace

 evil levi live veil vile

 evil levi live veil vile

似乎在第二种方法程序中复制结果并将已经找到的单词添加到输出中。我想知道为什么会发生这种情况?


芜湖不芜
浏览 158回答 1
1回答

喵喔喔

我不是100%确定,但我相信你看到一些这种行为的原因是因为你在哪里对流进行排序,是因为流经流的数据的“时间”。您的前额是将它们添加到已找到的单词列表中 - 但请记住,在调用前额之前不会评估任何数据。这意味着这些项目仅在整个集合流经前台时才被添加到列表中。在 foreach 之前发生的主筛选器可能会看到一些重复,因为它尝试按尚未真正存在的列表进行筛选。排序是给它带来麻烦,因为它可以阻止数据流 - 在看到每个元素之前,不能保证对列表进行排序。它不完全是一个终止操作,但它确实会延迟事情,直到所有元素通过。懒惰评估是一件很棒的事情,但它可能很棘手,通常你真的需要确保像排序这样的东西是你想要的,然后再走这条路。综上所述,如果您试图避免重复,那么有更好的方法可以做到这一点(stream具有一个功能,可以很好地为您完成)。.distinct()我已经编写了您在此处尝试执行的其他实现,该实现产生了以下结果。abel able bale bela elba alger glare lager large regal angel angle galen glean lange caret carte cater crate trace elan lane lean lena neal evil levi live veil vile 如果你愿意,我可以和你分享这个 - 但我得到的印象是,这是为了某些性质的任务,你正在自己挖掘它。如果是这样的话,对你有好处。如果您想要一些提示或从某人那里反弹问题,请随时给我发DM,我会很乐意为您提供帮助。之后,我将编辑这篇文章并发布我用来生成上面的块的代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java