1
00:00:00,210 --> 00:00:00,780
Bienvenidos.

2
00:00:00,870 --> 00:00:03,000
Veamos el happy stream de Yaba.

3
00:00:03,100 --> 00:00:09,270
Bueno, creo que es una combinación de las mejores ideas que tiene el literato y la programación funcional

4
00:00:09,300 --> 00:00:11,730
para implementar flujos de datos.

5
00:00:11,910 --> 00:00:18,360
Podemos definir como una secuencia de elementos que provienen de una fuente, una fuente de dato típicamente

6
00:00:18,480 --> 00:00:25,140
de una lista o una colección de yaba, ya sea un set, un list bueno, cualquiera que implemente la

7
00:00:25,140 --> 00:00:28,230
interfaz colectaron o un arreglo una matriz.

8
00:00:28,320 --> 00:00:34,080
Claro, también puedo convertir un arreglo común y corriente de Java directamente en un stream y que

9
00:00:34,080 --> 00:00:35,880
estos pasen por una especie de tubería.

10
00:00:35,880 --> 00:00:42,420
Filtros se pueden modificar los elementos, podemos ir y dando effi la idea poder realizar operaciones

11
00:00:42,540 --> 00:00:48,030
que se le conoce como operadores que son aplicado a cada uno de estos elementos que se van emitiendo,

12
00:00:48,030 --> 00:00:51,390
que van fluyendo en este flujo de datos.

13
00:00:51,450 --> 00:00:56,310
En esta secuencia bueno, como alegoría es como una tubería de agua, una corriente.

14
00:00:56,400 --> 00:00:59,730
De ahí viene el término stream de corriente o flujo.

15
00:01:00,000 --> 00:01:05,640
El orden que mantiene los elementos es el mismo que la fuente, es el mismo que mantiene el list@,

16
00:01:05,700 --> 00:01:07,800
por ejemplo, la lista o el arreglo.

17
00:01:07,890 --> 00:01:13,140
Pero un tema importante que hay que tener en cuenta los stream nos sirven para almacenar datos, no

18
00:01:13,140 --> 00:01:14,160
son contenedores.

19
00:01:14,370 --> 00:01:17,160
Almacenamos, por ejemplo, en un arreglo, en una lista.

20
00:01:17,310 --> 00:01:24,300
Simplemente esto es como una conducción para poder realizar un trabajo sobre los elementos de esta fuente.

21
00:01:24,480 --> 00:01:29,700
Entonces, un flujo no es una estructura de datos que almacena elementos, no es como Lalit las colecciones

22
00:01:29,760 --> 00:01:36,900
no en su lugar transmite esto elementos de una fuente como un generador o un canal de entrada y salida

23
00:01:37,110 --> 00:01:40,590
a través de esa tubería con operaciones computacionales.

24
00:01:40,740 --> 00:01:41,310
Esa la idea.

25
00:01:41,550 --> 00:01:43,560
Veamos las características más importante.

26
00:01:43,740 --> 00:01:48,930
Entonces permite crear flujo de datos continuos que contienen operadores para procesar una secuencia.

27
00:01:48,930 --> 00:01:54,570
Elementos Los operadores reducen notablemente las tareas de transformación de este flujo de este elemento.

28
00:01:54,720 --> 00:02:00,330
Después vamos a ver que podemos convertir, por ejemplo, un flujo de un tipo dato en un flujo de otro

29
00:02:00,330 --> 00:02:05,550
tipo dato o bien mantener el mismo tipo de datos, pero convertir la información por ejemplo a mayúscula

30
00:02:05,550 --> 00:02:11,670
minúscula, concatenar, agregar más información, obtener el máximo, el mínimo, contar elementos,

31
00:02:11,670 --> 00:02:17,280
sumar en caso de que sean numéricos, aplicar el operador por ejemplo distinto para no tener elementos

32
00:02:17,280 --> 00:02:20,250
repetidos y los repetidos se agrupan en uno solo.

33
00:02:20,370 --> 00:02:26,370
En fin, entonces se transforma y compone flujo con los operadores map que es para manipular modificar

34
00:02:26,490 --> 00:02:34,710
filter para filtrar concatenar con con cat el flat map sort para ordenar for each para iterar y mostrar

35
00:02:34,710 --> 00:02:41,820
los elementos para hacer algo redux para realizar una operación matemática, por ejemplo, o algún algoritmo

36
00:02:41,910 --> 00:02:45,090
de todos los elementos y finalmente convertirlos en uno solo.

37
00:02:45,210 --> 00:02:51,930
Y pueden ser creados desde cualquier estructura dato, desde una lista, un set, cualquier tipo collection,

38
00:02:51,960 --> 00:02:54,480
pero también arreglos y también rangos.

39
00:02:54,600 --> 00:02:57,060
Otra característica es la inmutabilidad.

40
00:02:57,180 --> 00:03:02,190
Esto significa que una instancia de cualquiera de ellos, de cualquier stream, no se puede modificar

41
00:03:02,250 --> 00:03:02,970
en absoluto.

42
00:03:03,120 --> 00:03:08,820
Sin embargo, cada vez que llamamos a un operador, por ejemplo, el map filter, que en realidad sí

43
00:03:08,820 --> 00:03:14,460
modifica la forma en que se representan los datos, pero no estamos modificando el objeto original como

44
00:03:14,460 --> 00:03:14,820
tal.

45
00:03:15,000 --> 00:03:19,830
No hay que tengo modificando el stream original, sino que cada vez que invocamos estos métodos se crea

46
00:03:19,920 --> 00:03:22,800
una nueva instancia de un stream nuevo.

47
00:03:22,920 --> 00:03:28,740
Con estos cambios y se deja la instancia original de flujo completamente intacta e inmutable, de tal

48
00:03:28,740 --> 00:03:31,350
forma que en cualquier momento podemos recuperar.

49
00:03:31,440 --> 00:03:34,610
Podemos volver al estado original que tenía antes.

50
00:03:34,710 --> 00:03:42,150
Entonces el map, el filter y cualquier operador retornan una nueva instancia del stream, no alterando,

51
00:03:42,210 --> 00:03:44,550
no modificando el stream original.

52
00:03:44,670 --> 00:03:50,910
Otra característica en la concurrencia hechos simple los stream nos permiten abstraer y simplificar

53
00:03:50,910 --> 00:03:53,870
bastante todo lo que concurrencia sincronización.

54
00:03:53,940 --> 00:03:56,310
Todo lo que detalle de bajo nivel de los Dredd.

55
00:03:56,400 --> 00:03:57,120
Los hilos.

56
00:03:57,240 --> 00:04:02,970
Podríamos tener múltiples tareas o procesamientos que se están ejecutando mismo tiempo y todos estos

57
00:04:02,970 --> 00:04:09,180
detalles problemas de bajo nivel se facilitan bastante de forma automática con el manejo de concurrencia.

58
00:04:09,370 --> 00:04:11,550
Ya vienen implementado en los extremos.

59
00:04:11,670 --> 00:04:13,710
Trabaja con flujo de datos continuos.

60
00:04:13,800 --> 00:04:16,200
Por ejemplo, acá tenemos un flujo de 9 elementos.

61
00:04:16,290 --> 00:04:22,680
Podríamos pensar o representar un stream como una línea de San Plage donde los elementos del flujo fluyen

62
00:04:22,800 --> 00:04:24,640
a través de una cinta transportadora.

63
00:04:24,660 --> 00:04:26,640
Por ejemplo, nuestra materia prima.

64
00:04:26,730 --> 00:04:32,010
Los elementos del flujo se van a mover a través de esta cinta para ser procesados con estaciones de

65
00:04:32,010 --> 00:04:38,160
trabajo donde captación de trabajo podría manipular estos elementos, convertirlos, filtrarlos, trabajar

66
00:04:38,160 --> 00:04:40,620
con ellos y otros pasos intermedios.

67
00:04:40,690 --> 00:04:45,840
Estas transformaciones irían a través de los operadores que convierten, transforman el flujo y finalmente

68
00:04:45,840 --> 00:04:50,490
termina como un producto final listo para ser enviado al consumidor.

69
00:04:50,700 --> 00:04:55,740
Los operadores reducen notablemente las tareas de transformaciones menos en más.

70
00:04:55,890 --> 00:04:58,770
Podemos hacer muchas cosas en unas pocas líneas de código.

71
00:04:58,860 --> 00:04:59,640
Por ejemplo.

72
00:05:00,010 --> 00:05:01,060
Tenemos el operador MAP.

73
00:05:01,210 --> 00:05:03,340
De hecho, estamos utilizando una prisión Lanta.

74
00:05:03,430 --> 00:05:09,280
Bueno, y prácticamente toda la implementación del API Stream está basada en operadores que trabaja

75
00:05:09,280 --> 00:05:16,270
con expresiones lambda, las que vimos en el caso del MAP con un Phantom, una función que pasa por

76
00:05:16,270 --> 00:05:19,210
argument un valor y devuelve este valor modificado.

77
00:05:19,420 --> 00:05:25,690
Acá podemos obtener este elemento que se emite y le podemos hacer o realizar alguna aplicación, alguna

78
00:05:25,690 --> 00:05:26,500
modificación.

79
00:05:26,650 --> 00:05:31,360
Por ejemplo, este valor multiplicarlo por 10 donde X es un número.

80
00:05:31,540 --> 00:05:38,380
O bien si tenemos un flujo que contiene un tipo usuario y el usuario tener varios atributos por ejemplo

81
00:05:38,380 --> 00:05:39,850
nombre, apellido o el email.

82
00:05:39,940 --> 00:05:44,940
Pero solamente nos interesa extraer el email nada más el email de cada usuario.

83
00:05:45,100 --> 00:05:45,700
Pero perfecto.

84
00:05:45,730 --> 00:05:52,240
Podríamos convertir con el MAP este flujo del tipo usuario a un flujo del tipo string que solamente

85
00:05:52,240 --> 00:05:53,390
contenga el email.

86
00:05:53,560 --> 00:06:01,240
Entonces finalmente regresaría un stream con todos los email de los usuarios y después podemos convertir

87
00:06:01,330 --> 00:06:04,390
este stream a otra lista con los datos procesados.

88
00:06:04,570 --> 00:06:11,170
Es decir, finalmente convertimos o traspasamos una lista de usuario a una lista de email del tipo String.

89
00:06:11,380 --> 00:06:14,680
Otro operador muy importante es el filter para filtrar.

90
00:06:14,770 --> 00:06:20,170
Por ejemplo, acá tenemos un flujo que contiene números, pero quiero filtrar solamente los que sean

91
00:06:20,170 --> 00:06:24,460
mayores que 10 y todo lo que sean menores que 10 no los vamos a procesar.

92
00:06:24,520 --> 00:06:28,750
Por lo tanto, que haríamos con el 30, con el 22 y con el 60?

93
00:06:28,870 --> 00:06:35,980
Luego trabajamos con ese subconjunto del stream original y así tenemos muchos operadores más para trabajar

94
00:06:36,040 --> 00:06:37,570
que los veremos durante esta sección.

95
00:06:37,750 --> 00:06:40,170
Nada más nos vemos en la siguiente clase.
