(ラムダ式なし)古い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()
関数を呼び出すと、この変数へのアクセスが失われます。 map()
関数を呼び出すと、d
変数へのアクセスをどのように保存できますか?
ありがとうございました。
新しいタイプにマップしたら、 'direction'にアクセスすることはできません。おそらく、 'VectorDirection'と' Checker'をカプセル化する新しいオブジェクトを作成し、そのタイプに 'direction'をマップすることができます。 – user7
別の可能性:マッピングステップで、cとdの両方がスコープ内にある場合、isCheckerBlockedの場合はnullにマップすることができます –
そのように書き直す理由があるかどうかわかりません。私はそれがコードをより読みやすくし、魅力的で、演技的にする方法を見ていない – Calculator