Ich habe eine Klasse, die Operationen auf einem Schachbrett macht. Jede Zelle hat ihre Zustände. Die Platte ist ein Array, deren Erklärung:Lambda als Methode mit Argumenten und Primitiven in Java
private CellState[][] cellBoard = new CellState[8][8];
I viele Methoden, die 3 Argumente haben: Reihe (horizontal), Datei (vertikal) und Zustand. Sie überqueren Zelle für Zelle. Refactoring Code zu wiederholen, schrieb ich die folgende Methode:
private void traverseBoard(Command method) {
for(int row = 0; row < 8; row++) {
for(int file = 0; file < 8; file++) {
method.execute(row, file, cellBoard[row][file]);
}
}
}
protected interface Command {
public void execute(int x, int y, CELL_STATE state);
}
In einem der Verfahren, überprüfe ich, ob jede Zelle leer ist:
private boolean areAllEmpty() {
ExtendedBoolean empty = new ExtendedBoolean(true);
traverseBoard((i, j, state) -> {
if (state != CELL_STATE.EMPTY) {
empty.set(false);
}
});
return empty.is();
}
ich nicht die primitive boolean
verwenden konnte, weil es unveränderlich. Zu diesem Zweck habe ich eine verschachtelte Klasse:
private class ExtendedBoolean {
boolean bool;
public ExtendedBoolean(boolean bool) {
this.bool = bool;
}
public void set(boolean bool) {
this.bool = bool;
}
public boolean is() {
return bool;
}
}
Ich hoffe, es gibt einen besseren Weg, um ein Verfahren mit mehreren Argumenten in einem Lambda-Ausdruck übergeben. Ich bin mir bewusst, dass es möglich ist, Runnable
like in this answer zu verwenden. In diesem Fall kann ich jedoch keinen Parameter übergeben.
Ich hoffe, dass ich ExtendedBoolean
nicht schreiben muss, deren einziger Zweck ist, ein primitiv zu wickeln. Ich musste auch ExtendedInteger
schreiben.
Sind meine Hoffnungen vernünftig?
EDIT: Die Sammlung von Zellzuständen muss veränderbar sein. Ich ändere die Zustände der Zellen und überprüfe sie dann. Ich mache es in einer Schleife, bis die Bedingung erfüllt ist.
Sie das Rad neu erfinden mit ExtendedBoolean und ExtendedInteger. Java verfügt bereits über Wrapper für Primitive, Boolean und Integer, um die von Ihnen verwendeten Namen zu benennen. – Dewick47
Eh. Es gibt ein paar Ansätze für dieses Problem, aber ich würde keine von denen nennen, die lambdas nice verwenden. Lambdas sind nicht wirklich gut darin, den Staat zu erhalten. –
Der Unterschied zwischen Ihrem 'ExtendedBoolean' und einem gewöhnlichen' Boolean' ist, dass es ** Mutable ** ist. Es gibt Mutables, die Sie stattdessen verwenden können (wie "AtomicBoolean"), aber die meisten haben unnötige Nebenwirkungen. – OldCurmudgeon