Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Duda con la nueva API Stream en Java8

Estas en el tema de Duda con la nueva API Stream en Java8 en el foro de Java en Foros del Web. Buenas tardes, una vez más tengo unas dudillas en mi periplo por java, y una vez más visto lo bien que me han podido ayudar ...
  #1 (permalink)  
Antiguo 16/12/2014, 11:58
 
Fecha de Ingreso: octubre-2014
Mensajes: 16
Antigüedad: 9 años, 6 meses
Puntos: 0
Duda con la nueva API Stream en Java8

Buenas tardes,

una vez más tengo unas dudillas en mi periplo por java, y una vez más visto lo bien que me han podido ayudar aquí, vuelvo a la carga :)

Estoy estudiando Colecciones, metodos para ordenarlas y cosas así, y tengo al final del tema un ejercicio que consiste en crear una clase con ciertos atributos junto a sus respecticos contructores, get/set, etc... y ademas otra clase con un arraylist de objetos de la primera clase y metodos para realizar cosas con ellos (ordenar por diferentes atributos y cosas asi)

Para resumir los ejemplos y puesto que es solo un método el que me da problemas, simplificare el código, digamos que tenemos una clase Personas con 2 atributos: nombre y edad.

Y por otro lado tenemos la clase que crea el arraylist, que como es un ejercicio de pruebas, los valores los he metido a mano en plan:

Código Java:
Ver original
  1. listaPersonas.add(new Persona("pepe", 34));

El caso es que el método que me da problemas, consiste en recorrer el arraylist y que devuelva la edad media de las personas cuyo nombre empiece por una letra dada en el argumento del método, algo asi:

Código Java:
Ver original
  1. public int edadMediaEmpiezanPor(char letra)

Y ahí básicamente me quedo, he empezado creando una variable llamada "edadMedia e intentando un filtro por el atributo nombre, parecido a esto:

Código Java:
Ver original
  1. public int edadMediaEmpiezanPor(char letra) {
  2. edadMedia = listaPersonas.stream().filter(e -> e.getNombre() // aqui es donde tengo problemas
  3. }

Pero ahí me quedo, seguramente este incluso mal ese trozo pero mi mayor problema es que no se como hacer que lea solo la primera letra de cada elemento del arraylist, las compare con el char del argumento y me de la edad media de todas las personas cuyo nombre coincida con ese requisito.

No se si me he explicado bien la verdad, espero que si xD

Gracias por la ayuda :)
  #2 (permalink)  
Antiguo 16/12/2014, 15:01
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Duda con la nueva API Stream en Java8

Buenas,

Yo creo que si estás empezando con las Colecciones lo normal es que las estudies bien y que cuando las domines a fondo entonces ya hagas cosas más avanzadas.

¿Sabes hacer ese algoritmo sin utilizar lambdas, mediante ifs y fors? Si no es así, ¿por qué no empiezas por ahí?. Una vez tengas dominado el tema, podrás experimentar para ver como conseguir el mismo resultado reduciendo código mediante streams, filtros y reducciones.

En cuanto a tu duda concreta, la respuesta depende de que tipo es la variable edadMedia, algo que no especificas. Pongamos que es un double

Código Java:
Ver original
  1. double edadMedia = listaPersonas.stream().filter(e -> e.getNombre().startsWith(letra)).mapToInt(Persona::getEdad).average().getAsDouble();


Un saludo
__________________
If to err is human, then programmers are the most human of us

Última edición por Profesor_Falken; 16/12/2014 a las 15:11
  #3 (permalink)  
Antiguo 17/12/2014, 03:22
 
Fecha de Ingreso: octubre-2014
Mensajes: 16
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Duda con la nueva API Stream en Java8

Gracias por tu respuesta.

Contestando a tu pregunta... si, trabajar con bucles for in, for each, if's y demás para estos casos lo tengo visto, voy siguiendo un libro y al final de cada tema van saliendo ejercicios y en este caso había que usar streams y lambda si o si (se supone que es para ver si realmente has pillado el tema, pero claro hay funciones que no aparecen y es cuando toca buscar xD)

Y si, perdona... edadMedia es un double :)

Respecto al código, gracias por tu ayuda, he tenido que modificarlo un poco puesto que el que me pasaste solo funciona si le paso un String como argumento al metodo, pero el enunciado del ejercicio te obligaba a usar un char.

Al final me ha quedado esto:

Código Java:
Ver original
  1. double edadMedia = listaPersonas.stream().filter(e -> e.getNombre().charAt(0) == letra).mapToInt(Persona::getEdad).average().getAsDouble();

No se si sera lo mas optimizado, pero funcionar funciona :D

Gracias por la ayuda :)

Etiquetas: api, arraylist, clase, stream, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:43.