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

问题描述 投票:0回答:2

我有两个列表,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...)
java lambda stream
2个回答
0
投票

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

“大多数流操作接受描述用户指定行为的参数,这些参数通常是 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());;

感谢马克-罗特维尔和亚历山大-伊万琴科:-)


0
投票

我正在使用有状态的 Map 迭代器,如下所示,支持两种状态(易于扩展) 状态是一个带有一个实例变量的简单类。 (我确信那里有一个包含类似内容的库......)

公共类 StatefulMapIterator ,S1,S2> {

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);
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.