Метод each
возвращает ту же коллекцию, для которой он был вызван, поэтому retVal
, вероятно, не является логическим значением «истина», но оценивается как «правдивый» (так как это коллекция, это будет означать, что он не пустой).
Если вы хотите проверить условие для каждого элемента в коллекции, вы можете использовать every
.
boolean checkLineageForTarget(Integer target, Collection<Node>stillToProcess){
stillToProcess.every { node ->
node.id != target && checkLineageForTarget(target, getParentNodes(node))
}
}
Обратите внимание, что мне не нужно проверять условие .empty
в коллекции родительских узлов, поскольку оно будет отфильтровано рекурсивным вызовом checkLineageForTarget (то есть вызов .every
для пустой коллекции всегда возвращает true). Кроме того, из-за короткого замыкания оператора &&
итерация останавливается, как только node.id == target
:)