[英]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.