====== 06 - La Forja: los informes del gremio en una línea ====== Los informes siguen con bucles manuales: sumar el poder de toda la plantilla exige acumulador, filtrar ítems de una rareza exige un ''if'' dentro de un ''for'', y buscar un héroe es la tercera vez que se escribe el mismo bucle de búsqueda. El paso aplica el tema: **lambdas e interfaces funcionales, API Stream y la clase ''Optional''**. ===== 1. Qué se pide ===== * El gremio gana un día de informes — cada uno declarativo, sin bucles a mano: * **Poder total** del gremio (suma del poder de toda la plantilla). * **¿Alguien veterano?**: una respuesta de sí/no para "¿hay algún héroe de nivel máximo?" * **Capitán** del gremio: el héroe de mayor poder. * **Selección de la forja**: los ítems de una rareza pedida, como nueva colección. * La **agrupación por clase** del paso 04, pero declarativa. * La **búsqueda de héroes** deja de devolver posiciones de la suerte (''-1''): su firma ya dice que puede no encontrar nada, y el que llama decide qué hacer con lo ausente — en La Forja, lanzar la excepción propia del paso 05. * Los bucles manuales que quedaban desaparecen: si un informe sigue con ''for'' cuando en clase se vio cómo se hace sin él, se defiende por qué. ===== 2. Con qué ===== * Todo lo del tema: **lambdas**, **interfaces funcionales**(predicate, function, consumer, supplier), operadores intermedios y terminales de **Stream** (filtrar, transformar, agrupar, sumar, comprobar, elegir), y **''Optional''** para el resultado que puede no existir. * Cuida el nombre de la operación: si el informe es una suma, que se lea como suma; si es una comprobación, que no termine acumulando ni ordenando. La regla del tema: el código se lee como la frase que lo describe. ===== 3. Decisiones tuyas ===== * ¿Devuelve el capitán un héroe o algo que *puede ser* un héroe? Y si no hay nadie en la plantilla, ¿lanza, devuelve ausente o muestra consola? Justifica el camino. * ¿La agrupación por clase produce qué estructura y en qué orden llega? ¿Le importa al que imprime? * ¿Dónde vive cada informe y qué expone: números crudos o colecciones listas para imprimir? ¿Quién decide el formato final? * ¿La comprobación de los veteranos cuenta a los veteranos o pregunta solo si hay? Son informes distintos — y uno de ellos desperdicia trabajo si lo eliges mal. * ¿Los ítems de una rareza comparten estructura con los héroes de una clase: es el mismo informe con otras palabras? ===== 4. Comprobación ===== * Los bucles ''for'' que quedaban en los informes han desaparecido: cada informe se lee de arriba abajo como una frase. * El poder total con una plantilla vacía no rompe nada: devuelve y se muestra lo decidido. * El busca héroe que no existe pasa por el canal propio del paso 05, sin ''null'' por el medio. * El ítem que no existe no rompe nada: la selección devuelve colección válida (vacía). * El capitán de un gremio de un solo héroe es ese héroe. * Las pruebas de los pasos anteriores pasan enteras. ===== 5. Pendientes ===== * El proyecto es un puñado de clases en el paquete por defecto; sin estructura y sin gestor -> paquetes y **Maven** (**07**). * El fichero de configuración aún se parsea a mano -> con una librería de **JSON** (**07**).