我有两个列表,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());;
感谢马克-罗特维尔和亚历山大-伊万琴科:-)
我正在使用有状态的 Map 迭代器,如下所示,支持两种状态(易于扩展) 状态是一个带有一个实例变量的简单类。 (我确信那里有一个包含类似内容的库......)
公共类 StatefulMapIterator
private State<S1> state1;
private State<S2> state2;
public interface Processor1<K,V,S1> {
void onIteration(K key, V value, State<S1> state1);
}
public interface Processor2<K,V,S1,S2> {
void onIteration(K key, V value, State<S1> state1, State<S2> state2);
}
public StatefulMapIterator(S1 state) {
this.state1 = new State<S1>(state);
}
public StatefulMapIterator(S1 state1, S2 state2) {
this.state1 = new State<S1>(state1);
this.state2 = new State<S2>(state2);
}
public void foreach(T t, Processor1<K,V,S1> processor) {
t.forEach((k,v) -> {
processor.onIteration(k,v, state1);
});
}
public void foreach(T t, Processor2<K,V,S1,S2> processor) {
t.forEach((k,v) -> {
processor.onIteration(k,v, state1, state2);
});
}