Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

139
Vistas
Java 11 Seleccione un método para aplicar en una secuencia según el valor de enumeración

Tengo la siguiente enumeración.

 public enum AggregationType { MIN, MAX, AVERAGE }

supongamos que tengo una función en la que paso un valor de enumeración como

 public Float someFunction(final AggregationType enum) { return (float) provides.stream() .mapToDouble(this::someFunc) .average() .orElse(-1); }

Quiero aplicar estos métodos .average() .min() .max() en una secuencia basada en el valor de enumeración.

¿Cómo puedo lograr esto? No quiero usar simplemente la función de cambio dentro de alguna función, sino en esta declaración de devolución.

Entonces quiero tener algo como

 public Float someFunction(final AggregationType enum) { return (float) provides.stream() .mapToDouble(this::someFunc) .decideWhichMethodShouldBeUsed() .orElse(-1); }

donde decideWhichMethodShouldBeUsed() decide qué función usar en función de la enumeración.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Cuando puede cambiar el tipo de enum a

 public enum AggregationType { MIN(DoubleStream::min), MAX(DoubleStream::max), AVERAGE(DoubleStream::average); public final Function<DoubleStream, OptionalDouble> operation; AggregationType(Function<DoubleStream, OptionalDouble> f) { operation = f; } }

puedes implementar el método como

 public Float someFunction(final AggregationType aType) { return (float)aType.operation.apply(provides.stream().mapToDouble(this::someFunc)) .orElse(-1); }

Si cambiar el tipo de enumeración no es una opción, debe manejar la asignación a la operación real en el lugar donde desea implementar someFunction , por ejemplo

 private static final Map<AggregationType,Function<DoubleStream, OptionalDouble>> OPS; static { EnumMap<AggregationType,Function<DoubleStream, OptionalDouble>> m = new EnumMap<>(AggregationType.class); m.put(AggregationType.MIN, DoubleStream::min); m.put(AggregationType.MAX, DoubleStream::max); m.put(AggregationType.AVERAGE, DoubleStream::average); OPS = Collections.unmodifiableMap(m); } public Float someFunction(final AggregationType aType) { return (float)OPS.get(aType).apply(provides.stream().mapToDouble(this::someFunc)) .orElse(-1); }

También puede usar una declaración de switch , pero es bastante torpe

 public Float someFunction(final AggregationType aType) { DoubleStream ds = provides.stream().mapToDouble(this::someFunc); OptionalDouble d; switch(aType) { case MAX: d = ds.max(); break; case MIN: d = ds.min(); break; case AVERAGE: d = ds.average(); break; default: throw new AssertionError(); } return (float)d.orElse(-1); }

Las cosas mejoran cuando usa una versión reciente de Java, ya que entonces puede usar una expresión de switch :

 public Float someFunction(final AggregationType aType) { DoubleStream ds = provides.stream().mapToDouble(this::someFunc); return (float)(switch(aType) { case MAX -> ds.max(); case MIN -> ds.min(); case AVERAGE -> ds.average(); }).orElse(-1); }

Esto solo lo acepta el compilador cuando se manejan todas las constantes de enum . Luego, generará un equivalente al default -> throw new AssertionError(); detrás de escena que nunca se tomará en tiempo de ejecución, siempre que nadie cambie el tipo de enum después de que se haya compilado este código.

Por lo general, solo la primera variante obliga a los desarrolladores que consideran agregar nuevas constantes a AggregationType a considerar también el manejo de la operation asociada.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda