Domanda

Per la milionesima volta, avrei voluto utilizzare un operatore IN in Java, simile all'operatore IN in SQL.Potrebbe essere implementato solo come zucchero sintattico del compilatore.Quindi questo

if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}

... sarebbe davvero fantastico.In effetti, quanto sopra è lo stesso del costrutto piuttosto prolisso (e non adattato per le primitive) qui:

if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}

O come questo per int, long e tipi simili:

switch (value) {
  case a:
  case b:
  case c:
    // ..
    break;

  case d:
  case e:
    // ..
    break;
 }

O forse potrebbero esserci implementazioni ancora più efficienti.

Domanda:

Qualcosa di simile farà parte di Java 8?Come posso dare un suggerimento del genere, se no?O esiste un costrutto equivalente che potrei usare adesso?

È stato utile?

Soluzione

Utilizzo di op4j :

Op.onListFor(a,b,c).get().contains(value);

Utilizzando lo stesso approccio, potresti creare classi helper Is con un metodo in:

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 );
    }
}

con un'importazione statica, puoi scrivere:

if(is(value).in(a,b,c)) {
}

Altri suggerimenti

Puoi scrivere un metodo di supporto per farlo.

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)) {

}

È stata presentata una proposta molto vecchia per i valori letterali di raccolta .

Attualmente esiste Sets.newHashSet in Guava che è abbastanza simile a Arrays.asList.

Stai cercando il Java Community Process

Dubito che qualcosa come un operatore IN sarebbe reso disponibile, poiché ci sono già molti modi per farlo (come usare switch) come hai sottolineato tu stesso.

E penso che l'elenco dei requisiti per project-coin e J8 sia già completamente caricato per poter essere preso in considerazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top