为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

芜湖不芜 2022-09-07 21:28:04
在使用字谜的练习中,我发现执行后的代码在输出中有重复项,具体取决于类中方法的使用时刻。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似乎在第二种方法程序中复制结果并将已经找到的单词添加到输出中。我想知道为什么会发生这种情况?
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

我不是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,我会很乐意为您提供帮助。之后,我将编辑这篇文章并发布我用来生成上面的块的代码。


查看完整回答
反对 回复 2022-09-07
  • 1 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信