当前位置: 首页 > 知识库问答 >
问题:

在Java流中peek真的只用于调试吗?

汪甫
2023-03-14

我正在阅读有关Java流的内容,并在此过程中发现了一些新的东西。我发现的一个新东西是peek()函数。我在peek上看到的几乎所有东西都说它应该用来调试流。

如果我有一个流,其中每个帐户都有用户名、密码字段和login()和loggedIn()方法。

我也有

Consumer<Account> login = account -> account.login();

而且

Predicate<Account> loggedIn = account -> account.loggedIn();

为什么会这么糟?

List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount = 
accounts.stream()
    .peek(login)
    .filter(loggedIn)
    .collect(Collectors.toList());
    null

做这样的事情有什么坏处?有什么理由不让我继续吗?最后,如果不是这个解决方案,那又是什么呢?

它的原始版本使用了.filter()方法,如下所示;

.filter(account -> {
        account.login();
        return account.loggedIn();
    })

共有1个答案

盖和泰
2023-03-14

关键在于:

不要以无意的方式使用API,即使它完成了您的眼前目标。那种方法在未来可能会破裂,对于未来的维护者来说也是不清楚的。

将此分解到多个操作中没有坏处,因为它们是不同的操作。以不明确和无意的方式使用API是有害的,如果在Java的未来版本中修改这种特定的行为,可能会产生后果。

它也更传统,因为peek是一个中间操作,在终端操作运行之前不会对整个集合进行操作,但foreach确实是一个终端操作。这样,您就可以围绕代码的行为和流程进行有力的论证,而不是询问peek是否会与foreach在此上下文中的行为相同。

accounts.forEach(a -> a.login());
List<Account> loggedInAccounts = accounts.stream()
                                         .filter(Account::loggedIn)
                                         .collect(Collectors.toList());
 类似资料:
  • 问题内容: 我正在阅读有关Java流的信息,并在不断学习中发现新事物。我发现的新peek()功能之一就是功能。我偷看的几乎所有内容都说应将其用于调试Streams。 如果我有一个Stream,其中每个帐户都有一个用户名,密码字段以及一个login()和loggingIn()方法,该怎么办。 我也有 和 为什么会这么糟糕? 现在,据我所知,这确实可以实现预期的目的。它; 取得帐户清单 尝试登录每个帐

  • 因此,我有一个对象列表,我想要部分或全部被处理,我想要记录那些被处理的对象。 为了进一步解释,这个问题的关键在于:“不要以无意的方式使用API,即使它完成了您的当前目标。”我的问题是,每次使用peek(从调试流到验证整个链按设计工作并再次删除.peek()为止)是否都是无意中的使用。因此,如果使用它作为记录流实际处理的每个对象的手段,则被认为是无意的使用。

  • 我偶然发现了一个我无法解决的任务。我不得不修改代码以打印而不是。 我明白为什么要这样印。 我很感激任何帮助。

  • 我的问题以最简单的可表达方式: 根据JavaDoc: 方法的存在主要是为了支持调试,您希望在元素流经管道中的某个点时看到它们。 我有一个10米的管道,在距离输入头3和7米的地方,我有两个标记[aka ]用于检查/调试我的元素。 现在从输入端开始,我给出<code>1,2,3,4,5</code>的输入。 在点x = 4米处,我有一个< code>filter()来过滤所有小于等于< code>3的