如何将Java Stream应用于具有if条件的现有forEach循环



我是Java流的新手,可以在ArrayList上使用Java流。这一次我没有任何线索,已经试了两个小时了。我不知道。我不确定是否可以在这里使用Java流。有人能指引我吗?我甚至不知道从哪里开始。我该如何检查以下条件transactions.getAvatarInfo() != null

这个for循环按预期工作。我需要在这里使用Java Streams而不是for循环。我能够在其他for循环中使用Java Streams,这是直接的。在这里,我甚至不知道从哪里开始。

for (int i = 0; i < accountInfo.get().getTransactions().size(); i++) {
Transactions transactions = accountInfo.get().getTransactions().get(i);
AvatarInfo avatarInfo = new AvatarInfo ();
if (transactions.getAvatarInfo() != null) {
transations.setAvataruri(TransactionsConstant.PREFIX + 
transactions.getAvatarInfo().getUserName().toLowerCase());
transactions.getAvatarInfo().setUserName(transactions.getAvatarInfo ().getUsername());
}
}

到目前为止,我已经在下面尝试过了,但在null之后说; is expeccted时出错。如果我加上这一点,就会出现另一个错误。

accountInfo.get().getTransactions().stream().filter(a -> {
AvatarInfo avatarInfo = new AvatarInfo ();
a.getAvatarInfo() != null
})

如果只有一个表达式,则可以仅使用该表达式编写lambda,如下所示:

a -> (a.getAvatarInfo() != null) // returns a boolean for filter

然而,当您引入{}时,您有一个完整的嵌入式方法,它必须遵循方法的所有正常语法。在这种情况下,由于lambda应该返回布尔值,因此需要

return a.getAvatarInfo() != null;

然而,new AvatarInfo()业务似乎完全没有必要,可以删除,从而允许您使用更简单的表单。

ArrayListCollection。由于Java 8Collection定义了一个stream()方法,该方法将返回ArrayList元素的Stream

请参阅https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#stream--

要获得列表,我们需要一个收集器,所以我认为它应该是这样的:

transactions.stream()
.filter(account -> account.getAvatarInfo() != null) 
.collect(Collectors.toList()); 

否则,它将只返回一个Stream而不是List。

最新更新