Java im Operator
-
29-10-2019 - |
Frage
Zum einmillionsten Mal hätte ich gerne einen IN
-Operator in Java verwendet, ähnlich dem IN
-Operator in SQL.Es könnte einfach als syntaktischer Compilerzucker implementiert werden.Also das
if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}
... wäre wirklich großartig.Tatsächlich ist das Obige dasselbe wie das ziemlich ausführliche (und nicht für Grundelemente angepasste) Konstrukt hier:
if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}
Oder so für int
, long
und ähnliche Typen:
switch (value) {
case a:
case b:
case c:
// ..
break;
case d:
case e:
// ..
break;
}
Oder es könnte noch effizientere Implementierungen geben.
Frage:
Wird so etwas Teil von Java 8 sein?Wie kann ich einen solchen Vorschlag machen, wenn nicht?Oder gibt es ein gleichwertiges Konstrukt, das ich jetzt verwenden könnte?
Lösung
Verwenden von op4j :
Op.onListFor(a,b,c).get().contains(value);
Mit demselben Ansatz können Sie eine Is
-Hilfsklasse mit der Methode in
erstellen:
class Is<T> {
private T value;
public Is( T value ) { this.value = value; }
public boolean in( T... set ) {
for( T item : set ) {
if( value.equals( item ) ) {
return true;
}
}
return false;
}
public static <T> Is<T> is( T value ) {
return new Is<T>( value );
}
}
Mit einem statischen Import können Sie schreiben:
if(is(value).in(a,b,c)) {
}
Andere Tipps
Sie können dazu eine Hilfsmethode schreiben.
public static <T> boolean isIn(T t, T... ts) {
for(T t2: ts)
if (t.equals(t2)) return true;
return false;
}
// later
if (isIn(value, a,b,c)) {
} else if (isIn(value, d,e)) {
}
Es gab einen sehr alten Vorschlag für Sammlungsliterale .
Derzeit gibt es Sets.newHashSet
in Guave, der dem Arrays.asList
ziemlich ähnlich ist.
Sie suchen nach dem Java-Community-Prozess
Ich bezweifle, dass so etwas wie ein IN-Operator zur Verfügung gestellt wird, da es bereits mehrere Möglichkeiten gibt (wie die Verwendung eines Schalters), wie Sie selbst betont haben.
Und ich denke, die Anforderungsliste für Projektmünzen und J8 ist bereits vollständig geladen, um so etwas zu berücksichtigen.