Существует старая кода Java (без лямбда-выражений):Как я могу переписать этот классический Java-код на код Java Stream API?
public List<CheckerPosition> getAttackedCheckersForPoint(CheckerPosition from, boolean isSecondPlayerOwner, boolean isQueen, VectorDirection ignoredDirection){
List<VectorDirection> allDirections = VectorDirection.generateAllDirections();
List<CheckerPosition> result = new ArrayList<CheckerPosition>();
for (VectorDirection direction : allDirections){
if (!direction.equals(ignoredDirection)){
Checker firstCheckerOnWay = findFirstCheckerOnWay(new CheckerBaseVector(from, direction), !isQueen);
if ((firstCheckerOnWay != null) && (firstCheckerOnWay.isSecondPlayerOwner() != isSecondPlayerOwner) && isCheckerBlocked(firstCheckerOnWay.getPosition(), direction)){
result.add(firstCheckerOnWay.getPosition());
}
}
}
return result;
}
Я пытаюсь переписать этот код на Java 8 Поток API стиль:
allDirections.stream()
.filter(d -> !d.equals(ignoredDirection))
.map(d -> findFirstCheckerOnWay(new CheckerBaseVector(from, d), !isQueen)) // In this operation I map VectorDirection element (d) to Checker variable type.
.filter(c -> (c != null) && (c.isSecondPlayerOwner() != isSecondPlayerOwner) && isCheckerBlocked(c.getPosition(), d)); // But in this operation I need to access d variable...
ПРОБЛЕМА: функция isCheckerBlocked()
(которая использует в последней операции filter()
) принимает переменную VectorDirection
типа (переменная d
). Но после вызова функции map()
я теряю доступ к этой переменной. Как я могу сохранить доступ к переменной d
после вызова функции map()
?
Благодарим вас за внимание.
Я боюсь, что вы не сможете получить доступ к 'direction', как только вы сопоставили его с новым типом. Возможно, вы можете создать новый объект, который инкапсулирует 'VectorDirection' и' Checker', и вы можете сопоставить «направление» этому типу. – user7
Другая возможность: на этапе сопоставления, где оба c и d находятся в области видимости, вы можете сопоставить значение null, если isCheckerBlocked –
Я не уверен, есть ли веская причина переписать его таким образом. Я не вижу, как это сделает код более читаемым, выполнимым, исполнительным и т. Д. – Calculator