Java 如何过滤具有自身映射引用的流?

Java 如何过滤具有自身映射引用的流?,java,java-stream,Java,Java Stream,下面的代码(简化为一个最小的、希望是自解释的示例)感觉很奇怪。我怀疑有比在状态上运行两次完整迭代更好的方法来检查属性。有人能给我一个提示吗 public AbstractState getInitialState() { List<AbstractState> sourceStates = states .stream() .map(AbstractState::getTransitions)

下面的代码(简化为一个最小的、希望是自解释的示例)感觉很奇怪。我怀疑有比在
状态上运行两次完整迭代更好的方法来检查属性。有人能给我一个提示吗

public AbstractState getInitialState() {

        List<AbstractState> sourceStates = states
              .stream()
              .map(AbstractState::getTransitions)
              .flatMap(Collection::stream)
              .map(AbstractStateTransition::getFrom)
              .collect(Collectors.toList());

        return states
              .stream()
              .filter(state -> !sourceStates.contains(state))
              .findFirst()
              .orElseThrow(NoInitialStateException::new);
}
public AbstractState getInitialState(){
列表sourceStates=状态
.stream()
.map(AbstractState::getTransitions)
.flatMap(集合::流)
.map(AbstractStateTransformation::getFrom)
.collect(Collectors.toList());
返回状态
.stream()
.filter(状态->!sourceStates.contains(状态))
.findFirst()
.orelsetrow(NoInitialStateException::new);
}

如果需要查找初始状态,是否意味着该状态的所有转换都将
状态设置为
null

假设:循环也需要忽略(如果适用,
的转换等于当前状态时)

如果是,可以简化整个方法:

public AbstractState findinInitialState(){
返回状态
.stream()
.filter(state->state.getTransitions().stream())
.filter(转换->//删除状态转换为自身的可能循环
!(state.equals(transition.getFrom())
&&state.equals(transition.getTo())
)
.allMatch(transition->transition.getFrom()==null))
.findFirst()
.orelsetrow(NoInitialStateException::new);
}

该代码是否真正实现了您希望它实现的目标?要确定初始状态吗?这通常不是根据转换准确声明而不是确定的吗?是的,正确的方法名称应该是
findininitialstate()
。是的,如果这是我的决定的话,到那时它的身份应该已经知道了。我必须处理混乱的局面:-(