繁体   English   中英

使用流进行迭代(在 for 中有一个标志)[在 lambda 中保持状态]

[英]Iterate with streams (with a flag in for) [keep state within lambda]

我有两个列表,allowedOU 和parts。 我需要知道如何遍历流,检查条件,如果为真,将元素包含在第三个列表中,并更改标志(可遗传)。

for (String part : parts) {
    for (BeanOU it : allowedOU) {
        if (part.startsWith("OU") && it.OU.equals(part.substring(3) && heritableFlag) {
            list.add(part.substring(3, part.length()));
            heritableFlag = it.heritable;
            break;
        }
    }
}

我尝试过这样的事情

parts.stream()
        .filter(parte -> allowedOU.stream()
                .anyMatch(allowed -> (parte.startsWith("OU")) 
                        && allowed.OU.equals(parte.substring(3, parte.length())) 
                 && finalHeritableFlag))
        .forEach(here we don't have it variable...)

“如果流操作的行为参数是有状态的,流管道的结果可能是不确定的或不正确的。”

“大多数流操作接受描述用户指定行为的参数,这些参数通常是 lambda 表达式。为了保持正确的行为,这些行为参数不应干扰,并且在大多数情况下应该是无状态的。这些参数始终是功能接口的实例,例如函数,通常是 lambda 表达式或方法引用”。

我留下这个以防有人需要它!

满足某个条件时停止的近似值,它为我们提供的是takeWhile

 List<String> partsList = Arrays.asList(parts);
        partsList = partsList.stream().filter((a->a.startsWith("OU"))).map(s->s.substring(3)).collect(Collectors.toList());
        List<String> finalPartsList1 = partsList;
        listOUallowedByUser = allowedOU.stream().takeWhile(allowed -> allowed.heritable).filter(f-> finalPartsList1.contains(f.OU)).map(a-> a.OU).collect(Collectors.toList());;

感谢 mark-rotteveel 和 alexander-ivanchenko :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM