使用流Java 1.8将嵌套的FOR循环转换为流

时间:2017-11-24 19:09:23

标签: java

想知道,如何使用java 1.8流转换两个嵌套的FOR循环。 场景: 变量usrAccountId - 由User发送 variable accountDetailsinRedis-实际上帐户存在于数据库中。 我实际上比较用户发送的accountId与数据库中的accountId相同。 这是在代码下面,我有两个嵌套的FOR循环,我想使用Stream将其转换为Java 1.8。任何人都有任何想法。

for (int usrAccountId : acctIDstoValidate) {

        for (Account account : accountDetailsinRedis) {

3 个答案:

答案 0 :(得分:1)

根据您的实际逻辑,您可以传递多个id来匹配 所以你可以有多个匹配。

acctIDstoValidate上流式传输,然后使用flatMap()上的accountDetailsinRedis对其进行链接,以对id进行过滤。

Collection<Integer> acctIDstoValidate = ...;
Collection<Account> accountDetailsinRedis = ...;


List<Account> matching = acctIDstoValidate.stream()
         .flatMap(idToValidate-> accountDetailsinRedis.stream()              
                           .filter(b-> b.getId() == idToValidate))
         .collect(Collectors.toList());

答案 1 :(得分:0)

你能详细介绍一下你在循环中做什么吗? 对我来说,我不知道你在这做什么,因此我建议你可以这样使用:

acctIDstoValidate.forEach(item -> {
   accountDetailsinRedis.forEach({
    //TODO
   })
});

有点像下面的代码片段

答案 2 :(得分:0)

使用猜测工具,假设您的示例中的两个变量都是集合,这可能就是您所追求的:

acctIDstoValidate.removeAll( accountDetailsinRedis.stream()    .MAP(帐户::的getId)    .collect(Collectors.toList()) )

你最终会留下enlid id:acctIDstoValidate

另请注意,您的变量命名方法可以改进,以便始终使用帐户而不是有时将其缩短为acct,而不是为了获得更好的驼峰套管而使用ID:accountIdsToValidate