我正在阅读有关Java流的信息,并在不断学习中发现新事物。我发现的新peek()功能之一就是功能。我偷看的几乎所有内容都说应将其用于调试Streams。
如果我有一个Stream,其中每个帐户都有一个用户名,密码字段以及一个login()和loggingIn()方法,该怎么办。
我也有
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());
现在,据我所知,这确实可以实现预期的目的。它;
这样做的缺点是什么?有什么我不应该继续的理由吗?最后,如果不是这种解决方案,那又如何呢?
它的原始版本使用.filter()
方法,如下所示;
.filter(account -> {
account.login();
return account.loggedIn();
})
关键要点是:
即使达到你的近期目标,也不要以意外的方式使用该API。这种方法将来可能会中断,对于将来的维护者来说也不清楚。
将其分解为多个操作是没有害处的,因为它们是不同的操作。还有就是在不明确的和意想不到的方式,如果这种特定的行为是用Java的未来版本中修改其可能的后果使用API的伤害。
使用forEach该操作将明确维护者,有一个预期中的每个元素的副作用accounts,并且正在执行某些操作,可能发生变异它。
从某种意义上说,它是更常规peek的中间操作,直到终端操作运行后才对整个集合进行操作,但forEach实际上是终端操作。这样,你可以围绕代码的行为和流程提出强有力的论据,而不是询问是否peek行为与forEach在此情况下相同。
accounts.forEach(a -> a.login());
List<Account> loggedInAccounts = accounts.stream()
.filter(Account::loggedIn)
.collect(Collectors.toList());
我正在阅读有关Java流的内容,并在此过程中发现了一些新的东西。我发现的一个新东西是函数。我在peek上看到的几乎所有东西都说它应该用来调试流。 如果我有一个流,其中每个帐户都有用户名、密码字段和login()和loggedIn()方法。 我也有 而且 为什么会这么糟? null 做这样的事情有什么坏处?有什么理由不让我继续吗?最后,如果不是这个解决方案,那又是什么呢? 它的原始版本使用了.fil
因此,我有一个对象列表,我想要部分或全部被处理,我想要记录那些被处理的对象。 为了进一步解释,这个问题的关键在于:“不要以无意的方式使用API,即使它完成了您的当前目标。”我的问题是,每次使用peek(从调试流到验证整个链按设计工作并再次删除.peek()为止)是否都是无意中的使用。因此,如果使用它作为记录流实际处理的每个对象的手段,则被认为是无意的使用。
我有一个带有ListView的FutureBuilder来显示自定义项(小部件),其值是从。txt文件中读取的。 问题是,只有当我在调试模式或运行模式下启动应用程序时,这些项才会显示。当我试图用AppLauncher打开应用程序时(就像“普通”用户会这样做一样),listView是空的。我在一个AVD和一个“真正的”设备上试过这个。
我偶然发现了一个我无法解决的任务。我不得不修改代码以打印而不是。 我明白为什么要这样印。 我很感激任何帮助。
我的问题以最简单的可表达方式: 根据JavaDoc: 方法的存在主要是为了支持调试,您希望在元素流经管道中的某个点时看到它们。 我有一个10米的管道,在距离输入头3和7米的地方,我有两个标记[aka ]用于检查/调试我的元素。 现在从输入端开始,我给出<code>1,2,3,4,5</code>的输入。 在点x = 4米处,我有一个< code>filter()来过滤所有小于等于< code>3的