Transcripciones
1. 01 Bienvenido al curso al curso: Hola ahí. Y bienvenidos a este curso, que proporciona una introducción integral del dedo del pie trabajando con el trabajo, una plataforma de la que mi nombre podría hablar. Seré tu instructor. Tengo más de 20 años Experiencia es ingeniero de software y arquitecto de nivel de código trabajando en diversas organizaciones desde grandes bancos de inversión globales a través de dos pequeñas
startups de alta tecnología . Estoy muy emocionado de personificar mi trabajo, conocimiento
correcto, y vamos a divertirnos mucho juntos, aprendiendo sobre todas las fantásticas nuevas características que el trabajo tiene para ofrecer. Entonces, empecemos.
2. 02 Introducción de Java 8 la teoría y los ejemplos de la teoría y: antes de meternos en mirar Java ocho. Desde el sexo y los ejemplos, es que nos hemos tomado apenas unos momentos para entender un poco sobre para qué estás Es sobre lo que trae a la mesa. John ha estado por ahí desde hace más de 20 años. Ahora 23. De hecho, en probablemente se esté hablando más de Java ocho, este lanzamiento en particular que cualquier otra versión y con toda razón. Es la versión más significativa desde que se lanzó el trabajo porque introduce los
cambios de idioma en la plataforma. lo que acabo de hablar nuevos ojos MP y mejoras de velocidad y herramientas. Ahora este lanzamiento de la plataforma Java nos da nuevos constructos en el trabajo un problema en el lenguaje mismo. Entonces en esta sección, vamos a conseguir algún contexto y ver qué es java,
cuáles son los bloques de construcción de los hombres y cómo se relacionan entre sí. Y de esta manera tendremos una buena visión general de
alto nivel de la plataforma y fundación para construir. Entonces empecemos
3. 03 diferencias entre los elementos orientados y los estilos de programación funcional.: en este video, vamos a tener otra visión de la idea detrás de sus opera para que podamos ponerlo todo en contexto. Java. Es un tema grande, así que nos va a hacer algo bueno. Entonces ahora ¿qué lo hace tic? Entonces, ¿qué es Javaid y por qué es tan importante? Bueno, con Java, hay una nueva gran idea en la ciudad, y esa es la idea de la programación funcional. De esto se trata el trabajo ocho. De verdad. Ahora, como los programadores Java estaban acostumbrados a la idea de programación orientada a objetos O R P. Aquí es donde los hombres bloque de construcción de nuestros programas, las cosas se construye el problema. El yo de pueblo es el objeto. Creamos clases que modelan algún dominio. Ya sabes, algún escenario del mundo real, que es relevante para la aplicación que estamos diseñando, crean instancias de esas clases. Se trata de objetos, arrojado algún comportamiento REM muerto, y luego tenemos una aplicación para que así api, que utiliza objetos en su bloque de construcción principal en. Ya estamos familiarizados con esos ya que llevamos llamando así desde el inicio de Java. Ahora en la programación funcional, el bloque de construcción de los hombres es la función. Es algo que toma una entrada. Hace algo a ella realiza alguna operación sobre él en retornos, una salida. Por lo que tenemos dos enfoques de programación muy diferentes aquí. Podemos usar objetos en nuestro mundo P o podemos usar funciones en un mundo funcional. Ahora probablemente estés pensando, ¿cómo se relaciona esto con el trabajo ocho? Bueno, cómo esto se relaciona con el trabajo es el trabajo del SIDA como programación funcional a la plataforma. Esto significa que ahora tenemos lo mejor de ambos mundos. Podemos utilizar los objetos y sus métodos de la manera imperativa como siempre hemos estado acostumbrados a hacer. O podemos crear usando funciones compuestas, ponerlas juntas sobre operar sobre datos de una manera declarativa que breve a un lado, solo uso dos términos ahí en no quiero que solo vuelen más allá de ti sin entender exactamente lo que ellos significa imperativo. Y la claridad. Sólo para que estés consciente, con estos hombres yendo hacia adelante dice que son dos estilos de programación muy diferentes sobre metodologías. Por lo que programar de una manera imperativa o programar en un lenguaje de programación imperativo significa que realmente estás definiendo exactamente cómo se debe hacer algo. Por lo que este nivel se preocupaba por cosas como cómo los bucles concordaban con las variables que usan las banderas que establecemos para comprobar ciertas condiciones para poder controlar
la salida del bucle, etcétera. El problema imperativo se basa en ese tipo de construcciones de mejor nivel, por lo que tipo de codificar la solución a algo desde la base. Estás realmente Koerting, La implementación golpe a golpe en el detalle permitido por esas diversas construcciones de
lenguaje de programación estándar disponibles para ti. Esa es una programación imperativa. Todos estamos acostumbrados a hacer esto ya, ya que así es más o menos como hemos hecho las cosas con trabajo hasta este punto. Simplemente piénsalo como programación regular, ya que es lo que todo el mundo está acostumbrado a hacer ahora en el Mar de Java, los buscadores persona puntan mundos net programación en un clima declarativo, nuestra programación con un problema declarativo en el lenguaje. Esto significa que no estamos enfocados en cómo hacemos algo así como somos una programación imperativa. Entonces no somos problema en los detalles reales de una solución. Usando esas construcciones de nivel base como bucles, condición, ALS, declaraciones de
cambio, etcétera. No es de extrañar la claridad del estilo. No estamos especificando eso cómo hacemos las cosas, sino que estamos definiendo lo que queremos hacer. Entonces el turno va a especificar lo que quieres que suceda, a diferencia de cómo quieres que suceda. Veremos a medida que pasamos por el curso cómo Java rate nos permite usar cualquiera de los estilos debilitar, apegarnos a la forma imperativa tradicional de codificar cosas como siempre nos hemos acostumbrado. O podemos utilizar las características de programación funcionales que proporciona la plataforma para poner en práctica nuestras soluciones en la claridad de camino. Esto lo veremos más cuando lleguemos a ductos y arroyos más adelante en el curso. Pero yo sólo quería asegurarme de que entendemos lo que esos dos términos significaban ir hacia adelante. Por lo que ahora estamos en la misma página con unos paradigmas de programación diferentes, orientados a
objetos en su forma imperativa y funcional en su forma la claridad. Probablemente te imaginas que esto vamos a poner bajo el problema en paradigma a la
plataforma Java , que es efectivamente, lo que han hecho con el sida de trabajo es en realidad una gran cosa. Y lo es. Resulta, tiene un impacto masivo y lleva un trabajo, una plataforma a
un nivel completamente nuevo en productividad programadora y expresividad dentro de la tarjeta. pocas palabras, esto significa que Kurt, escrito con Java ocho, ahora
es más fácil de escribir debido a esta razón más fácil de depurar sobre adaptar hombres 10 realmente es un enorme avances del trabajo de plataforma, y te va a convertir en un desarrollador mejor y más productivo para ello. Vas a estar emocionado de aprender todo al respecto y ver qué puede hacer por ti. Seguro te explicaré todo al respecto en los próximos videos.
4. 04 un vistazo rápido de las características principales de Java 8 8: fin de que la ayuda laboral introduzca la programación funcional a la plataforma. Se agregaron algunas nuevas características del lenguaje. Existe la mayoría de esas características, así que por qué eso te permiten codificar de manera funcional o se han introducido para incorporar esta nueva maquinaria de programación funcional, si te gusta en la plataforma. Entonces vamos a cavar ahora y echar un vistazo a las diferentes piezas de Job ocho, que hacen imposible el problema funcional. Por cierto, medida que pasamos por estos, podrían sonar intimidantes. Pero no te preocupes. Iremos a una unidades más en detalle y posteriores. Nosotros sólo los estamos presentando aquí para que no se sientan tan extraterrestres. Tú, cuando vengamos a hablar de ellos en cada sección diferente, así que aguanta ahí o se aclarará a medida que salgamos por el curso y los miramos a todos juntos. En primer lugar, tenemos expresiones lander. Estos permiten pasar funciones de comportamientos, que es un aspecto clave de la programación funcional. Entonces, ¿qué? Nos referimos a conductas pasadas. Bueno, por comportamiento, nos referimos a un trozo de código que podría ejecutarse. Alguien sí nos permite pasar trozos de código alrededor en un bonito, fácil y ligero. Se pueden pensar en ellos como métodos sin nombre por ahora, que podrían asignarse en rojo a partir de variables sobre dos métodos pasados. Aquí te dejamos un bajo expresión simple para darte una idea antes de Java. Ocho. Solo se puede pasar el comportamiento creando una clase que albergara el método. Continuó el trozo de código que querías pasar, pero de manera diferente. Siempre que querías pasar código, tenías que crear una clase para ello solo para poder hacer eso. Y será esa clase la que tenía el método, que a su vez, tenía los Niños podría realmente querer pasar? Entonces con Java ocho. no tenemos que hacer eso, gracias a un lander. Expresiones, como se puede ver ahí, látigo
bonito y ligero. No son pesadas en las manos. No necesitamos escribir mucho. Compara eso con la forma de hacer las cosas de la vieja escuela en el pre trabajo Ocho mundo. Tenemos que hacer algo así como esta horrible cosa que puedes ver aquí que tenemos que escribir la clase de
encierro de la que acabamos de hablar. Tenemos que codificar la firma del método torpe para posiblemente tener una interfaz, desde cuando su pasado a lo que necesite recibirla. La tarjeta de llamada necesita tener una forma de acceder a ella. Y eso es a través
de interfaces, por supuesto, para que puedas ver la pre java ocho vía es torpe, verbosa, y simplemente se siente innecesario, verdad. No es solo mecanografiar extra. Tienes que hacer eso. Tienes los archivos extra en tu proyecto a uno para la clase y posiblemente uno para la interfaz. Si te lo das tú mismo y quieres tener el bagaje mental ahora de tener que lidiar con dos nuevos tipos,
bueno, bueno, la buena noticia es que con expresiones de error introducidas en Java, comió, todo esto es redundante. Simplemente escribes y pasas una lambda en tus expresiones prestamistas. Elimina la necesidad de crear esta tarjeta calderilla alrededor del método, y yo estaba demasiado limpia y concisamente pasé justo el código. A continuación, contamos con interfaces funcionales, que proporcionan un rango de los llamados tiempos de destino para las expresiones de lander. Es genial que ahora podamos pasar funciones alrededor de árbitros en pulgadas, expresiones de
lander, pero aún necesitamos mantener tipos de cosas. Si al almacenar el lander, expresión en las variables está pasando o devolviéndolas de los métodos, no
olvides que todo siempre necesita escribir. Siempre que haces estas cosas en Java
, no cambia. Este trabajo sigue siendo en gran medida un lenguaje fuertemente tipado, por lo que necesita haber algún tipo de mecanismo para mantener las cosas seguras en
interfaces funcionales . Haz esto por nosotros. Te das un vistazo a escondidas, pero sin entrar en detalles masivos. Aquí. Esta es una interfaz de funciones en acción. Se puede ver que estamos asignando una expresión prestamista, que duplica números a una llamada interfaz funcional definida en Job ocho. El inter función, una función que llamamos toma una entrada en devuelve un resultado, y en este caso, toma un inter y devuelve y termina Porque es bastante común java. Nos da una interfaz de función predefinida para esto, ¿
cuál es esta en función? Ya ves, también
puedes escribir tus propias interfaces de función a, así que no hay necesidad de preocuparte. Siempre tendrás un sitio objetivo para tus Landers. Profundizando en la productividad del programador. Ahora hay un nuevo stream verse deploy, que lleva una programación funcional de suministro a colecciones y operaciones de cadena juntas, por ejemplo, filtrando una lista de objetos que aplicar un mapeo para acceder a la filtrada objetos en Finalmente convertirlos de nuevo en un conjunto, por lo que el resultado sería un conjunto filtrado del tipo de mapas. Aquí hay un fragmento de código, que hace justamente eso. Agradable y conciso sobre la claridad de en la naturaleza. Entonces con ductos y arroyos, pasamos menos tiempo diciendo cómo hacemos las cosas y nos concentramos simplemente en lo que queremos hacer. Usando este estilo declarativo, son más fáciles de usar y explican lo extremadamente poderoso. Por lo que esas son las características de los hombres en la tasa de Java. Pero además de esas, era necesario tener algunas otras características y conceptos para poder hacer que todo funcionara bien juntos. En otras palabras, no romper el código heredado existente. ¿ Qué lo está potenciando para ofrecer la nueva forma
funcional de hacer las cosas? Entonces ahora tenemos lo que yo llamo las otras características de Jarve. A. Estos son como el pegamento que lo apunta todo junto con el fin de problematizar y funcionalmente particular con el cambio de stream mejores operaciones que acabamos de mencionar. No queremos tener que empezar a preocuparnos por revisar las finales ahí dentro. Opcionales proporcionan una forma ordenada y ordenada de lidiar con esto. Hay un zp oy opcional, que es mejor para proporcionar una forma de nivel de tipo para prevenir la temida ni la
excepción de puntero , que encaja naturalmente en un contexto funcional. De hecho, hay todo un aire p que escribí alrededor de este concepto opcional, lo que significa que no solo puedes lidiar con la programación de stream de una manera funcional, sino también hacer algunas cosas funcionales agradables con condiciones para, entre otras cosas pasando. Tenemos métodos por defecto estos permiten definir implementación llamada dentro de una interfaz. Ahora esto suena un poco contradictorio. Después de todo, estamos acostumbrados a interfaces sólo teniendo métodos abstractos públicos y sin implementación. Pero no es un error. Realmente sí existe. Y en realidad es una forma elegante de poder evolucionar una interfaz que está en un futuro a ella sin romper las implementaciones existentes. Esto es algo que se requería para facilitar Java ocho stream mejor programación a través todas las clases de colección. También tenemos métodos estáticos e inter vs a los que nuevamente proporcionan implementación pero no son específicos de una instancia de una interfaz. Por lo que es un buen lugar para poner métodos de utilidad, por ejemplo, que podrían pertenecer ahí. Por último, al
menos en términos de lenguaje, rasgos
significativos, tenemos referencias de métodos. Es probable que éstos proporcionen designado a un método simplemente suministrando su nombre. Esto nos permite reutilizar los métodos existentes que tenemos en contextos funcionales tratándolos como Expresiones Lambda y utilizándolos en los mismos lugares. Entonces, por ejemplo, podemos pasar los métodos existentes en torno al uso de estos y enchufarlos a nuestras tuberías
de procesamiento de recolección . Por lo que hubo un rápido resumen de las características más importantes en el siguiente. Unidades mirarán a cada uno a detalle para ver cómo juega un papel en el trabajo. Un paisaje. Es mucho para aceptar y no esperes que entiendas ni una fracción de la misma de ese breve panorama estará cavando en detalle en los videos posteriores, pero esto fue solo para darte una prueba de lo que está por venir.
5. 05 pasos del comportamiento con expresiones de Lambda: por lo que tenemos trabajo ocho, haciendo el movimiento audaz y emocionante para introducir la programación funcional en la plataforma. Esto significa que ahora las funciones se han convertido en ciudadanos de primera clase en el idioma. Entonces para aclarar lo que eso significa, podrían pasarse a regreso de métodos almacenados en variables sobre modificadas, igual que trabajo de Primitivos y objetos Camp. Para apoyar esto, Java introduce un nuevo constructo que permite definir funciones. Después de todo, si estás almacenando estas funciones en variables y pasándolas por ahí, necesitas tener una forma de crearlas realmente en primer lugar. Por lo que en Java, se pueden crear funciones con este nuevo constructo, que se ha introducido sólo para este propósito. Esta es la expresión Lambda, mientras que predominantemente pasamos los datos alrededor de las funciones de empaquetado sin sistema, un pinto Lambda expresiones nos permite pasar el comportamiento alrededor. Vamos a echar un vistazo rápido al camino. Ya estamos acostumbrados a la conducta pasajera. El escenario más común que surge a la mente nuestros oyentes de eventos. Aquí es donde se pasa incurrido para ser ejecutado en respuesta a una pulsación de botón, por ejemplo. Esto es común en swing y android. A través de la acción, los oyentes hacen clic en los oyentes etcétera siguiente tenemos comparativo. Aquí se crea una clase que sabe comparar con objetos del mismo tipo, que define un orden entre ellos. Después puedes pasar esto a una rutina dolorida, que lo usará para ordenar los elementos de acuerdo con la comparación. Después tenemos los diversos filtros que podríamos implementar,
por ejemplo, por ejemplo, de filtro de nombre de archivo, que puede filtrar una lista de archivos. hay muchos otros casos, en los También que pasamos el comportamiento por ahí, pero estos son algunos comunes, con los que probablemente ya estás familiarizado. Las expresiones prestamistas permiten que operaciones como estas se expresen de manera muy concisa, con la cantidad mínima de código. Esto lleva al funcional Koenen Job ocho. Siendo muy compacto y elegante como veremos para demostrar esto, recordemos lo que tendríamos que hacer para conseguir un botón para responder a un evento de click en swing previo a Java. Ocho. En primer lugar, tendría que crear una clase rápida, que tenga el método que queremos ejecutar cuando se haga clic en el botón. Este es nuestro manejador de eventos ocurrió. Swing off fue la interfaz de escucha de acción para esto en. Podemos ver aquí estamos implementando esa interfaz para que podamos tapar el comportamiento uno. Entonces no estanciuteamos esa clase para que podamos pasar el objeto resultante al
método que los registros son manejador de eventos. Esta es la acción que se realiza con ella en Jay Button. A pesar de que es un código bastante simple, todavía es relativamente no trivial ponerlo todo junto. Después de todo, sólo
queremos ejecutar el método con una línea y tenemos que proporcionar una clase proporcionando la acción es. El motivo de esto es que antes de Job ocho en los perímetros son, los objetos se podían pasar a métodos on, por lo que lo mejor que podíamos hacer entonces era pasar un objeto que tenía el núcleo pero método que queríamos ejecutar. Podríamos compactar en menos líneas allí. Por ejemplo, si no necesitamos que el oyente de eventos se use cualquier otro componente u i, entonces podríamos definir las clases Anónimo y pasarlo en línea a la convocatoria para la lista de
acciones publicitarias . El método como este, esto ahorra es crear un trabajo adicional, un archivo fuente, solo una casa, nuestro manejador de eventos. Pero en última instancia seguimos teniendo que escribir mucho coraje para hacer algo que debería ser bastante sencillo. Ahora Java ocho nos permite pasar el comportamiento en forma de expresiones lander de
manera muy concisa, sin el bagaje de tener que crear una instancia. Ver un contenedor o clase rápida como vimos antes. Aquí está el ejemplo equivalente en el código Job ocho aquí. Acabamos de pasar la función que es la expresión lander al método, y eso es todo lo que necesitamos. Entonces como puedes ver, las expresiones de
Lunder nos permiten recortar mucho código boilerplate, ya que las funciones ahora se han convertido en ciudadanos de primera clase en el lenguaje, y esto es clave para permitirnos hacer programación funcional de manera muy limpia y concisamente sobre el trabajo de plataforma en el siguiente, videos profundizarán en definir el nuestro propio bajo expresiones y ver cómo usarlos.
6. Síntesis y ejemplos de expresiones Lambda y expresiones de la lambda y de 06: en este video, vamos a ver cómo crear nuestras propias expresiones Lambda. Entonces examinemos ahora las expresiones Sensex de Lambda para que podamos empezar a usarlas. Bajo expresión consta en su mayoría de tres partes parámetros que definen las entradas a la función, seguido de un operador de flecha que parece apuntar al cuerpo de la función, que podría ser una sola expresión en múltiples sentencias. Tal ex general es así, pero hay variantes para hacer exclusivo al Sensex. El como veremos. Es más fácil e intuitivo ver ejemplos de expresiones lander para entender la sintaxis y sus variaciones. Entonces, veamos ahora algunos ejemplos. Se trata de una Lambda que toma ni parámetros no tiene entradas sobre Prince. Un mensaje a la consola. Ya que no toma parámetros, tenemos paréntesis vacíos en el bloque de Pam. Esa es la puja frente al operador de flecha en siempre necesita proporcionar estos, a pesar de que la función no toma entrada. Además, dado que el cuerpo de la función es solo una sola declaración, no
necesitamos suministrar llaves circundantes. Compare eso con este ejemplo aquí tenemos múltiples sentencias en el cuerpo de la función que es el bit después del operador de flecha, y así las necesitamos aquí. Entonces siempre que tengas múltiples declaraciones y no solo estás devolviendo un valor o haciendo algo simple, diciendo un solo liner, necesitas encerrar el cuerpo del Lambda en llaves. Es igual que con si else bloquea,
realmente, realmente, si necesitamos más de una declaración en la F, o de lo contrario los necesitamos ahí,
también, también, así que nada debería sentirse tan extraño con esto. Ojalá, hasta
ahora, acabamos de ver prestamistas simples, que no toman ningún argumento ni devuelven los valores, retomando una muesca. También podemos pasar entradas bajo expresiones, también. Ahora, esta expresión de Lunder toma dos extremos y los multiplica. También devuelve el valor. Si bien esto no es explícito en la sintaxis en general, se acepta que Lambda puede o no devolver un valor sobre especificar esto habría hecho ya que el acto Smart fallo para lidiar con esto probablemente sí se siente un poco extraño. Ya sabes el hecho de que no especificamos un tipo de devolución, pero solo es la forma en que es. No te pongas eso. Pronto te acostumbrarás bastante pronto. También verás, en este ejemplo que los parámetros están separados con el comercio en la lista de parámetros respecto a los parámetros de entrada. No es que los tiempos sean realmente opcionales y no es necesario especificar si el compilador canon más tipos basados en el uso de expresión lander. Por lo que también podríamos admitir los tipos de los parámetros de entrada como en este ejemplo, los dos parámetros A y B un prefijo con sus tipos. En este ejemplo, los tipos siempre son opcionales si el compilador com'on para ellos. En función de cómo se está utilizando la expresión lander, la sintaxis es bastante sencilla e intuitiva, como se puede ver. Por supuesto, no
hemos cubierto la situación donde tenemos tres parámetros. Dos de ellas son cadenas, y una es un entero, y volvió al doble. Pero probablemente puedas averiguar cómo podrías escribir esto de cualquier manera que quieras dar los tipos o hecho. No necesitas preocuparte por el tipo de devolución, y solo tienes que hacer entonces es averiguar si necesitas poner tirantes rizados. Sin embargo, si se trata de un bloque de código de múltiples líneas, por lo que las expresiones prestamistas agradables ,
ligeras y fáciles usar, no se pueden usar en el correr ellos. De hecho, si solo copias pegar esas expresiones entramos en una idea, tal y como se espera compilar. No va a hacer todavía, y eso es porque no pueden simplemente existir en la fuga. Necesitan ser almacenados en una variable o método Pastore, y para ver cómo hacerlo, necesitamos entender las interfaces funcionales y los tipos de objetivo, que hará en los próximos videos, así que quédate con nosotros.
7. 07 introducción a las interfaces funcionales con ejemplos: interfaces funcionales o un nuevo concepto en Java ocho introducido para apoyar el uso de expresiones
Lambda. Entonces, ¿qué son exactamente? Bueno, una función se expresa en forma de expresión lander. Esta es la encapsulación del código de función en una forma que podría pasarse a un método . Retorno del método o asignado a una variable. No obstante, Java es un lenguaje fuertemente tipado con un sistema de tipos estricto, y así cualquier cosa que almacenemos passel return requiere un tipo bien definido. Esto significa que necesitamos una forma de proporcionar un tiempo caído bajo expresiones sobre esto es exactamente lo que hacen las interfaces funcionales. Proporcionan los tipos de referencia para las expresiones de lander. Aquí tienes una expresión de lander trivial. No toma ningún parámetro de entrada y simplemente imprime un mensaje a la consola. Ahora supongamos que queremos almacenar este lander. expresión en una variable o plácida es un parámetro a algún método, pero con la referencia Tybee que usaríamos, resulta que podríamos usar algunos tipos diferentes. Pero por el bien del argumento, usará éste, que comunica la idea de ejecutar una pieza de código, como es con nueve puestos o devolver valor el rentable. Ahora normalmente asociamos la interfaz renovable con el funcionamiento de las amenazas, pero cómo la estamos usando aquí no tiene nada que ver con eso. Es sólo una interfaz funcional, que pasa a ser un tipo de objetivo compatible para la expresión prestamista se les dio. Llegaremos a lo que realmente son las interfaces funcionales en un momento, y cómo las definimos explicará todo esto. Pero por ahora, solo aguanta ahí con el ejemplo y no te des en ningún pensamiento de multi threading porque no tiene nada que ver con ello. Por lo que podemos usar renovable como nuestro tipo de referencia en la compilacion. Sería feliz. Esto se debe a que la firma de método del método de ejecución en ganable coincide con la firma del
método implícito de la expresión lander. En otras palabras, no
se necesitan argumentos de importación a la función en devoluciones. Sin valor. No es que podamos usar cualquier método compatible. Se define en una interfaz funcional. Entonces, por ejemplo, si tuviéramos una interfaz de función definida así, también
podríamos asignar la misma expresión de lander a esa referencia. Tipo dos. Por lo que esto también es legal. Este es un video corto que tiene algunos puntos clave, los cuales debemos enfatizar función Existen interfaces, por lo que las expresiones de lander podrían estar ligadas a un tipo conocido como tipo de destino. Podría haber muchos tipos válidos diferentes, que una expresión de lander podría ser gorila. Todo lo que se requiere es que las firmas de métodos sean compatibles. ¿ Están ahí excepto la misma entrada y devuelven el mismo tipo? Son el pegamento, si quieres, que permiten que las expresiones lander tengan un tipo en Java. Ahora esto es genial. Ya sabes por qué tenemos interfaces de función, pero eso aún deja algunas preguntas. ¿ Cómo encontramos interfaces funcionales para usar en? ¿ Y si uno no existe ya? ¿ Podemos conformarnos los nuestros? Bueno, estas son grandes preguntas sobre responderá estas en los próximos videos también.
8. 08 el uso de descriptores de función para elegir los tipos de objetivos compatibles: ya que Job es un lenguaje fuertemente tipado donde todo debe tener un tipo. También se requiere que las expresiones de Lunder tengan un tipo. Ahora es aquí donde las interfaces de función entran en la imagen sobre la idea de
descriptores de función . Entonces echemos un vistazo rápido juntos ahora a qué se trata todo esto. Un prestamista expresiones como ésta tiene un método implícito. Firma. Mira la sintaxis. Podemos ver que esto bajo expresión toma A y B demasiado intensos en retornos. Significa que esta firma implícita de método de una expresión lander es mejor conocida como su descriptor de
función. El descriptor de función es simplemente forma ofensiva de decir qué tipos a la función toma como entrada en qué tipo devuelve su salida. Es la firma del método, si se quiere, sin el método en ellos. Ahora, 13 descriptores no se usan en código Java. No es como una cosa de sintaxis ni nada. No declaras descriptores de función ni nada por el estilo. Entonces no es algo que probablemente te encuentres durante el desarrollo de datos en Java ocho. Pero la nuestra manera útil de pensar sobre los tipos, y usaban detrás de bambalinas en la compilación del código, pero sin embargo lo útil que hay que tener en mente a la hora de considerar tipos de expresiones prestamistas. Eso es lo clave aquí. Entonces echemos un vistazo ahora a algunos descriptores de función de muestra. Aquí hay uno que no toma entradas y devuelve vacío. Esta función es barrida. Igualaría con una interfaz Venable. Por ejemplo, dado que el método definido en la interfaz no toma argumentos y no devuelve nada, solo
echemos un vistazo rápido de actualización a esa interfaz renovable aquí. puede ver que no toma ningún argumento. No hay nada entre paréntesis después del método. Ellos y luego el tipo de retorno es efectivamente nulo, lo que
significa que no devuelve nada. Por lo que sin embargo definitivamente coincide con la función. Nueva Strip, por ejemplo. Acabamos de ver esta función Descriptiva toma para insistir en parámetros sobre retornos y en la espalda, se podría imaginar una expresión lander, que realiza una operación de anuncio toe y para introducir juntos que está teniendo esto ahora para el ejemplo
anterior. Fue bastante sencillo pensar en una interfaz que coincidiera con ésta, aunque Quizás sea más un reto encontrar una en la existente. Jenny vino Bueno, sería antes de Job ocho, pero por suerte, esta liberación se envía con toda una colección de útiles. Vamos a llamarlos iniciar un interfaces funcionales que se pueden utilizar. Entonces, de hecho, hay una interfaz que hace esto ya sabía a Java ocho. Una interfaz que toma dos elementos del mismo tipo en les aplica una operación para producir un resultado. El mismo tipo se conoce como operador, por lo que Java ocho ofrece la interfaz de operador binario para esto ha mostrado aquí se puede ver hecho toma a wince en retornos un final de nuevo coincidiendo con el distrito de funciones de ejemplo . Entonces acabamos de dar Ahora este es nuestro último ejemplo. Muestra una función que no toma argumentos en produce una cadenas su valor devuelto nuevamente Jarve ocho interfaces funcionales llegan al rescate ofreciendo lo que se conoce como proveedor. Esta es una interfaz funcional la cual devuelve algún valor. Java es algunos de estos, por ejemplo, de suministro booleano devolverá un valor booleano doble proveedor devuelve un doble valor y así
sucesivamente . Así que probablemente estarías esperando a un proveedor de cuerdas y ciertamente lo harías si todo
lo que hicimos fuera correcto. Hola programas mundiales. Pero para la fuerza er tenemos que hacer un poco más de trabajo y usar la interfaz genérica. Pero es útil tener una mirada rápida. trata de una interfaz de proveedor, Setrata de una interfaz de proveedor,
que mucho se puede ver que no toma ningún parámetro y simplemente devuelve el valor
del tipo de parámetro de vuelta, que en nuestro caso, sería una cadena de todos modos. No queremos empezar a correr antes de que podamos caminar por ahí, así que no nos desvíemos con genera. Por ahora. El elemento clave es que una expresión de lander puede ser descrita por un descriptor de función en que un descriptor de función puede coincidir potencialmente con muchas interfaces diferentes. Por supuesto, usaré uno, pero está entregado para tener eso en mente. No es solo como si solo hubiera una interfaz que nunca puedes usar un tipo de expresión de lander ni nada, así que esto nos lleva al siguiente punto. Entonces, para determinar si una expresión prestamista se puede escribir en una interfaz funcional, consideramos los descriptores funcionales de ambos ítems. Si los descriptores de función son compatibles, entonces la expresión de lander se puede asignar al tipo de interfaz funcional. manera más técnica, se permite a
la expresión prestamista tener un tipo de destino fuera de la interfaz funcional. Entonces ahora hemos visto unos descriptores de función y sabemos que son útiles hasta dos años al considerar qué tipos podemos usar para Lambda Expressions y tocamos
interfaces de función a. Esperemos que estos tres conceptos de piedra angular Lambda Expressions descriptores de función en
interfaces funcionales . Pop. Todo está empezando a hacer clic en su lugar ahora, probablemente lentamente al principio. Hay mucho que tomar, así que no te preocupes si aún no estás del todo ahí, pero deberías poder tener una buena sensación ahora de cómo están relacionados, y veremos más de éstos en acción a medida que avanza el curso.
9. 09 descripción de las Streams, intermediate y las operaciones de: Por lo que hemos visto el lenguaje central soporta Java. AIDS ofrece sus funciones de escritura y manejo,
a saber, lambda Expresiones e interfaces funcionales. Ahora que hemos visto eso, es el momento de dirigir nuestra atención a otra nueva introducción a la plataforma Java A. Y esas son las transmisiones FBI, las transmisiones. El FBI te permite procesar las colecciones de forma funcional. Después de todo, los diseñadores de idiomas hicieron grandes esfuerzos para poder permitirnos usar funciones en nuestro trabajo ocurrieron el. Entonces es razonable ahora que deberíamos poder usar ese brillante y cornu estilo de programación declarativo en nuestro código existente. Y no hay mejor lugar nuestro lugar con bang más grande para el dinero, como si fuera hacer eso en una jugada todo eso de cartas buenas, funcionales, limpias y concisas. Entonces, cuando estamos trabajando con colecciones, las colecciones FBI siendo algo con lo que trabajamos a diario, claro. Es decir, ahora
podemos aplicar funciones ser correctas o incluso funciones que ya existen para poder manipular la colección en. Hacemos esto enchufando esas funciones a un llamado ducto lo que va en esto en un segundo, pero solo sepan que el gran titular aquí es que el FBI de Stream proporciona una forma muy limpia y concisa de procesar mejor en un artículos funcionales. Ya veremos en breve, por cierto, no es absoluto que ver con el procesamiento de colecciones. Ese es su único propósito. Cuando piensas en los streams MP, automáticamente
asocio en tu cabeza con las colecciones. No tiene nada que ver con el Iowa P I y Java utilizados para salida importante a través sus clases ahí, con nombres como Input Stream y Output Stream on. Cuando hablemos del i o A. P, me referiré al IR basado en stream. Pero no hay nada en el Java ocho streams FBI, que tiene que ver con aquellos que simplemente pasan a usar el mismo término en común. Sólo recuerda, Java ocho streams ahi p I iguala el procesamiento de colecciones de una manera funcional. Entonces ahora lo hemos dejado claro. Echemos un vistazo a lo que son realmente los flujos. ¿ Cuál es exactamente el arroyo? Bueno, un arroyo es una secuencia de elementos de una fuente que permite
aplicarle múltiples funciones encadenando operaciones en una tubería que puede procesar los datos alguna manera. Es importante tener en cuenta que el flujo no es una estructura de datos como cualquiera de la recopilación de trabajos. Las clases son. En otras palabras, no te permite estancar los elementos sino procesarlos en algún lugar. Por lo que los arroyos AP oy nos permite encadenar operaciones juntas en nuestras funciones, aplicando a la recolección de las diversas etapas en esta cadena este ducto círculo. Estas operaciones, que se habían encadenado a este ducto, son de dos tipos. Se trata de operaciones intermedias y operaciones terminales. Ahora se construye un ducto de típicamente una o más en algunas operaciones de medios, que se encadenan junto con una cadena de operación terminal hasta el final. Por lo que
intermedios, intermediarios, intermedios terminales. Imagina que esto sería un punto simple para un ejemplo, así podemos ver que realmente son las operaciones intermedias las que proporcionan el mecanismo de procesamiento
funcional en curso . Después de todo, la operación terminal acaba de terminar el ducto. Es terminal es que está al final por lo que podemos ver que a través de este ducto deuda segundo piso entre operaciones. De ahí la palabra stream. De hecho, porque eso es lo que es una corriente, es un flujo direccional de datos. Entonces eso es un flujo entre estas operaciones siendo procesadas de alguna manera por funciones a lo largo del camino. Este encadenamiento a través de operaciones intermedias se logra mediante esas operaciones intermedias, siempre devolviendo una referencia al arroyo, que proporciona el mecanismo, que permite construir una tubería. Esto lo veremos más adelante cuando veamos al propio FBI con más detalle. Otro punto interesante es que al separar los tipos de operación en intermedios y terminales los flujos, los diseñadores
del FBI hicieron Java ocho streams evaluados perezosamente. Ahí está la evaluación significa que una operación intermedia no se evalúa realmente hasta que se alcanza
una operación terminal al final de la cadena, por lo que son perezosos en ese sentido. Una operación terminal, sin embargo, es la operación realmente desencadena la evaluación del ducto que es, las operaciones previas a la operación terminal. Al tener este último paso desencadenó la evaluación del ducto, el propio ducto podría incluso optimizarse en. Eso sucede realmente detrás de las bambalinas. Para nosotros, este es un concepto bastante abstracto que está más allá del alcance de este curso. Pero no hace falta decir que los flujos DePuY te esconde toda esta complejidad y solo entrega
beneficios de rendimiento sin costo adicional. En este punto, sin embargo, algún código de ejemplo sería bueno para mirar ya que este material del gasoducto suena bastante arriba en el aire. Entonces bajémoslo a la Tierra y pongámosle un mango juntos, cual hará en el próximo video.
10. 10 entender el procesamiento de la recolección de pieles y fluir las operaciones comunes de la API en la API en la: Ahora acabamos de pasar por la visión general de alto nivel de ductos y arroyos on. Agradezco lo abstracto que debe de ver. Entonces gracias por pasar por eso. Y no fue fácil encenderse. Vamos a saltar ahora y al mar algún código para que podamos conseguir un manejo adecuado de lo que significa. Aquí hay una tubería de muestra, que crea una corriente de algunas cadenas. Hace esto para que puedan ser procesados usando los streams. FBI. Eso es lo que hace la transmitida fuera. Crea un arroyo el cual podemos realizar operaciones funcionales en un ducto a procesar. Los días fueron de alguna manera, así que tenemos esta corriente de cuerdas encendida. Con esto. Podemos procesarlo utilizando todo lo que los streams, oficinas
del FBI, que cubrirán en breve. En primer lugar, desglosemos lo que está pasando en este carbón, aunque lo primero que piedra con el arroyo es hacer un mapeo. Esto mapea una cadena en la corriente a su versión en mayúsculas. Todas son operaciones de stream, o más bien, todas las operaciones de stream intermedio devuelven un stream, como dijimos antes, por lo que esto significa que podemos seguir adelante y hacer más procesamiento basado en stream después de este mapa operación. Por lo que a continuación, la cadena de cuidado superior se pasa a través de un método de filtro. Esto filtra hacia fuera. Muchas cuerdas tienen exactamente cinco caracteres de longitud. Después se aplica una especie en el arroyo. Retorno de ese método de filtro en. Por último, el flujo se procesa con una operación de terminal, que en este caso recorre cada elemento en la secuencia imprime el valor. Aquí está pasando mucho, pero los puntos clave a tener en cuenta son que necesitamos comenzar con el stream para poder utilizar los
flujos que emplean,
que se expone a flujos que emplean, través de la interfaz de stream. Entonces efectivamente encadenamos operaciones juntas para formar un ducto. Este encadenamiento es posible ya que las operaciones intermedias devuelven un arroyo cada vez que frío . Entonces al final del ducto, obtenemos los datos reales. Y así lo hacemos terminando el ducto con una operación terminal. Este estudio evalúa el ducto sobre retornos, los resultados para volver a nuestro ejemplo, que vimos antes. Sabrás que las operaciones intermedias toman una expresión de lander. En otras palabras, de la función. Aquí es donde entra en ella el aspecto funcional, y así cada operación en la canalización aplicó efectivamente para funcionar a los elementos del arroyo con
el fin de realizar su procesamiento. Esto plantea la pregunta, por
supuesto. ¿ Cuál es el tipo de módulo de aterrizaje que se pasa para cada operación? Entonces en el caso de la operación intermedia de mapa, esto toma una función de cadena a cadena. Recuerde, una función toma una entrada en los retornos, una salida. Entonces en este caso, toma una cadena y devuelve una cadena. En el caso de la operación del filtro, esto toma un Pritikin. ¿ Lo valorarías para encadenar entrada a un matón y salida efectivamente formando una puerta para que
los elementos pasen? Por último, para cada toma un consumidor de string, alguna función que podría pasarse una cadena y hacer algo con ella, que en este caso pasamos abundan. Instancia con referencia al método de la línea de impresión off system toe out, que a su vez, príncipe dos cuerdas una por una a la consola. Ahora hemos visto la operación básica de un simple plan de puntos. Echemos un vistazo a cómo realmente podemos crear streams en primer lugar para que puedas crear una secuencia de una de dos maneras, ya sea llamando al método de flujo en una clase de colección limitada a listas y conjuntos o
creando una secuencia a partir de un array con transmitido apagado. Ahora sí vi que se puede transmitir en las listas y sets. Probablemente estés pensando, ¿qué pasa con los mapas? Y ese es un buen punto. Todavía puedes procesar estos en un arroyo de la mejor manera. Simplemente haces eso a través de, digamos, trabajando en cualquiera de los métodos de mapa, que devolverá un conjunto, por ejemplo, un procesamiento de flujo
tan nuevo en todo interés en un mapa, por ejemplo, puedes llamar a stream desde el conjunto, que se produce cuando invocaste los intereses ese método en el mapa. Algo a señalar, que es bastante genial, dehecho, hecho, es que los métodos predeterminados se introdujeron en Java ocho con el único propósito de poder agregar un método de flujo a las clases de colección existentes sin romper implementaciones existentes. Entonces esa es la gran idea detrás del método predeterminado. Ahí mismo en acción, puedes echar un vistazo al video en método predeterminado, lo que ellos o sobre los que están en las ideas detrás de ellos más adelante. Por lo que ahora podemos crear un arroyo. ¿ Qué podemos hacer con ella? O tenemos bastantes métodos los cuales están disponibles en la interfaz de flujo en estos parecerán abrumadores al principio, pero proporcionan un ambiente muy rico dentro del cual concursamos funcionalmente. No te preocupes por la cantidad de métodos y lo desalentador que podría parecer. Es bastante sencillo una vez que estás acostumbrado a ello. Sólo recuerda que tenemos dos tipos de operaciones. Las operaciones intermedias devuelven un flujo cada vez para que podamos seguir procesando y encadenando en operaciones de
medios juntos para formar un ducto sobre operaciones terminales. No regresarán un arroyo. En cambio, devolverán resultado vacío o no de flujo, ya que así es como se evalúa en última instancia el ducto para acceder a los datos del proceso. Dado que tenemos dos tipos de operaciones intermedias en terminal, tiene sentido agrupar los métodos en la interfaz de flujo por estos dos tipos de operación. Entonces consideremos en las operaciones de los medios. En un principio, cuando pensamos en las colecciones en las que podrían basarse los flujos, podríamos imaginar una de las cosas más importantes que querría poder hacer es filtrar los elementos que permite el método de filtro. Esto on realmente filtra el arroyo a los elementos que coincidieron con el predicado más allá de él. Pasamos un predicado que recordará retornos verdaderos o falsos evaluando el elemento contra su condición. A continuación, nos
imaginamos que nos gustaría poder mapear elementos de un formato a otro en el mapa. El método nos permite hacer justamente esa misma cosa. Por ejemplo, si tuviéramos una corriente de objetos de empleados, podríamos mapear para obtener solo los nombres de los empleados. Existen otros métodos intermedios a eso. Podemos usar el más común que se ordene, que ordena los elementos en la corriente en distinto, lo que elimina cualquier duplicado dentro de esa corriente. Entonces esa fue una mirada a lo más común en las operaciones de los medios. Ahora echemos un vistazo a las operaciones de terminal. Como dijimos antes, estos no devuelven un flujo en efectivo porque la tubería a evaluar para que podamos ver estos métodos realmente está siendo los métodos de sitio de resultados que devolvieron el conjunto de
resultados terminados . En otras palabras, van a devolver el flujo de procesos como una colección días impresionantes para sobre los elementos del arroyo. De alguna manera, probablemente lo más común que querrías hacer con el flujo de procesos es capturar sus elementos de
proceso. Entonces imagina que estamos filtrando, mapeando agrupaciones. Posiblemente comenzaste con una colección del punto de hacer todo eso bien para que
terminaras con una colección diferente del final de la misma, Así que los métodos más comunes resultarían en una nueva colección de los streams. Elementos son los dos métodos en la clase del colector a establecer, que devuelve un conjunto de los elementos en a lista, lo que envía una lista. Lo siguiente que viene a la mente si pensamos en lo que queremos sacar de un
flujo de proceso es una observación sobre los elementos en el arroyo. Entonces para ello, impugnamos los elementos en el arroyo. Y cuando pensamos en probar algo, realmente
estamos invocando una función contra un elemento que evaluará a verdadero o falso. En otras palabras, estamos proporcionando una práctica por lo que este tipo de funciones toman un predicado para ser realizado en los elementos de la corriente. Todo el partido devolverá verdadero si todos los elementos en la secuencia pasan por el crítico suministrado, cualquier coincidencia volverá a si algún elemento individual pasa el crítico. Inevitablemente, esto cortocircuito y se romperá de la iteración asume que se encuentra
el primer elemento que coincide con el depredador. Los métodos de queja a estos también son no coincidentes donde ninguno de los elementos coincidió con el predicado suministrado. Esto obviamente tiene que probar todos los elementos de la colección, así que preocúpate mucho de esto para grandes colecciones, rendimiento sabio y primer partido, lo que te dará un opcional fuera del primer elemento pasando al depredador. También sepan que esto es un opcional en las palabras esto podría volver vacío opcionalmente de Ningún elemento coincidió con una gran manera de entender la fuerza Marina Lo que hemos visto aquí. Es un toma algún tiempo para seguir adelante y crear algunas colecciones y escribir algún mejor
código de stream usando los streams opioide para procesarlos mediante la creación de tus propios ductos. Por lo que en este módulo hemos visto la potencia de las tuberías y el flujo mejor procesamiento con los flujos emplean. Como puedes ver, proporciona una forma muy ordenada y legible de procesar colecciones, y en poco tiempo, te adaptarás a procesar tipos de colecciones de esta manera muy sucinta, elegante y funcional.
11. 11 es un opcional y cómo se utilizan.: en este video, vamos a echar un vistazo a la nueva característica de opciones de velocidad de Java, que nos da una nueva y poderosa forma de trabajar con valores que comunales como veremos So Java . Ha introducido esta nueva característica de opciones, que proporciona una forma segura de tipo de tratar con los valores posiblemente de Newell. Nos permite lidiar con esos tipos de valores elegantemente y código funcional sin tener que recurrir a boilerplate ni cheques. Ya sabes, esos si tal y tal no es igual a saber condicional es que llegamos a todas partes en el trabajo ocurrió cada vez que accedemos y objetamos campos sobre métodos. Ahora bien, si piensas en cómo podrías hacer esto por un momento, no
es inmediatamente obvio cómo podemos evitar tener que hacer estos sin cheques, ya que están tan arraigados en nuestro estilo de desarrollo actual de hoy. Pero una vez que veas al FBI opcional en acción, verás que es bastante sencillo de entender. Y sobre todo va a hacer que tu código más limpio sea más legible y generalmente más agradable para trabajar. Entonces echemos un vistazo juntos ahora. Es útil tener un resumen rápido sobre el manejo de cero antes de Java ocho para poner el FBI opcional en contexto para Veamos un ejemplo rápido. Entonces consideremos este método Aquí. Aquí tenemos un departamento de clase, el cual tiene un método para conseguir al empleado del mes. Ese método devuelve un objeto de tipo empleados, cual asumirá que tiene el nombre de la persona ahí y posiblemente algunos de los ítems extra que nuestro programa podría estar interesado en usar este método cada mes, podemos generar un reporte, que incluye a los empleados estelares actuales así. Esto funciona bien hasta que nos encontramos con un mes en el que nadie trabajó lo suficiente para ganar el título de
empleado del mes el, terminamos sin punto ni excepción. Cuando tratamos de obtener su nombre en esta ocasión, empleado era conocido, como todos sabemos, cada vez que tratamos de tratar, referenciar y toda referencia, decir, acceder a algún campo en el objetos en el método invoca. En él, obtenemos la temida excepción ni puntero. Ahora podemos arreglar esto agregando unas pocas líneas más y comprobando el nulo como este. Cuando hacemos esto, ahora
estamos asegurando que la variable superestrella definitivamente tenga una referencia de objeto válida en ella. Antes invocamos cualquier método en su contra. Las superestrellas son iguales a ninguna expresión se conoce a veces como guardia. Por cierto, sólo para que lo sepas, ya que podría escuchar ese término a de vez en cuando un camino de regreso al código, sin embargo, el código con un cheque nulo alrededor es mejor. Bueno, al
menos en términos de que ahora sea más confiable, definitivamente no
vamos a entrar en todos los puntos o excepción cuando hagamos esto, pero sigue siendo tres líneas de código para hacer algo bastante sencillo. Veamos cómo las opciones en Java AIDS pueden mejorar la situación ahora. El problema con el método que hemos estado buscando es que no obliga a la persona que llama a lidiar con el hecho de que podrían no ser un valor ahí dentro. No hay ninguna advertencia al programador de que puedas volver,
y no, dehecho, hecho, si lo piensas, confiabilidad
del método simplemente se basa en el problema de ser un buen ciudadano para chequear. No se sabe, por si
acaso. Job Right corrige esto al permitirte envolver un objeto y un opcional De esta manera, siempre
tienes que pasar por lo opcional antes de poder llegar a las cosas buenas dentro del objeto
real para que pudiéramos tener un opcional de empleados, para ejemplo, ha regresado. En esto. Esto significa que el valor de las envolturas opcionales ya sea sostiene de nuestros empleados de TI objeto. O tiene una referencia de Newell ahora trayendo esto ¿No es Nolan aspecto en un tipo real ? Mi clase E en realidad ahora obliga al programador a ocuparse de los dos casos separados. De manera limpia, no
hay salida. Ahora hay que lidiar con el hecho de que podría ser no on ocurrió explícitamente el caso cuando es no en el caso. Cuando sea una referencia válida, ya
veremos. También sé que por tener que pasar por esta clase de rapero opcional, que envuelve el objeto que realmente quieres, hace cumplir esto tratando sin valores. Ahora con un nivel de tiempo de compilación. Este es un bonito efecto secundario. Esto significa que las excepciones inesperadas que utilizó para obtener un tiempo de ejecución en producción por no abordar
apropiadamente si un valor podría ser no o no, esas excepciones ahora se convierten en preocupaciones de tiempo de compilación cuando el propio compilador uno que usted ignorarlo. Esto es realmente bueno. Significa que terminaremos escribiendo más código estadounidense sobre no dejar las cosas al azar tanto porque ahora nos vemos obligados a lidiar con la posibilidad de saber explícitamente, así que no más. Ah, sí, olvidé el cheque. Fue no. Cuando cur sopla en producción, sobre todo,
las opcionales proporcionan un avión para tratar estos casos no o poblados de una manera agradable, funcional. Por ejemplo, este código de pre trabajo ocho que hemos estado buscando se puede volver a escribir de manera más elegante en Java
sustituyéndolo por esta versión más funcional. El primer ejemplo devuelve a un empleado en ello es hasta el programa y para recordar hacer los cheques
nulos . Y así esto es imperativo en la naturaleza, Recordando el Mundo Imperativo grabando explícitamente. El segundo ejemplo devuelve un opcional de empleados el. Debido a esto, no
tenemos que escribir los cheques nulos, debilitar solo delegado al FBI opcional para lidiar con fuera por nosotros y simplemente invocó la función. Observe que esto es de naturaleza funcional. Es un estilo más declarativo. Solo estamos diciendo que lo que queremos que suceda, no cómo así. Aquí es hacer esto cuando no se sabe, a diferencia
de comprobar si no lo es, ni primero, luego hacer esto. Hay una diferencia sutil, pero es agradable notar. Por lo que las opcionales traen a la mesa a un empleado, lo que nos permite interactuar con valores que pueden o no el presente de una manera muy limpia y funcional, que juega muy bien con el resto del trabajo. Ocho Conceptos como veremos.
12. 12 comprensión de la API Optionals: en este video, vamos a morir de avanzar y echar un vistazo profundo a las opciones atrayentes. Entonces vayamos a ello. Entonces, como dijimos en la última unidad, la idea detrás de un ocho opcional en Java es que trae un tiempo rápido a la tabla, que en efecto establece que el objeto que envuelve puede ser una referencia de objeto válida o comunal . Esto se hace con el tipo opcional en el paquete Java Util, y aquí hay un ejemplo de solo que los empleados podrían ser no o podría ser un
objeto real de los empleados . Ahora, como opcional es un tipo real en sí mismo, es un objeto. De hecho, viene con un conjunto propio de métodos que nos permiten trabajar con opcionales. Esto se conoce como el opcionalmente aparecen en. Con esto, podemos hacer lo siguiente. Podemos crear opciones si vamos a usarlas. Después de todo, necesitamos tener una forma de crearlos nosotros mismos. Si vamos a poder pasarlos de vuelta por mis métodos a otras personas que llaman, podemos comprobar sus valores en las palabras. Ver si sí contienen una referencia de objeto o consentimiento válido. No, también
podemos, si no se refieren a objeto nulo, obtener sus valores arriba. Dado que ahora hay un nivel de indirección, donde obtenemos el valor rap de
lo opcional, también nos permiten especificar valores predeterminados en el caso. El valor del rap es no. Este es otro buen beneficio que es poder suministrar el aspecto de valores por defecto. Y por último, hay algunos usos más avanzados que tiempo o en el lado de programación funcional donde podemos devolverlos condicionalmente. Planificarlos más sobre esto un poco más tarde. Pero por ahora, justo eso, que esta característica permite que las opciones jueguen bien con los nuevos ductos y arroyos. Conceptos de Java ayudas de todos modos, suficiente ,
intra, veamos en acción. En este video, vamos a ver el 1er 4 primero arriba, creando opcionales. Si el opcional tendrá un valor, no olvide que el punto de un opcional es que podría o no el valor contendiente. Entonces puedes crearlos usando el método de factor estático opcional off. Tomemos esto, por ejemplo. Aquí tenemos una cadena que está envuelta en un opcional Sé que como usuario del
método de factor , se espera que el valor U Pass no sea no Si lo es, este método arroja una excepción de puntero nulo. Gastan el suyo propio a cómo crear un opcional que no tiene valor, un llamado NT opcional. Bueno, hay otro método de fábrica estática para ellos, que es opcional el vacío. Ya que estamos creando una entidad opcional, que no hace referencia a un valor, no
necesitamos pasar ningún valor a ese método. Ahora bien, si quieres crear un opcional fuera de una referencia que puede o no ser no, puedes hacerlo con el método off gullible. A diferencia de doff opcional este arrojado o puntos o excepción si el valor pasado es no. Entonces en este punto, ahora
sabemos cómo podemos crear opcionales, que están ahí. Definitivamente mantener de valor definitivamente no tienen valor en mi dicho el valor. Esto nos lleva a cómo mirar dentro de las opciones para ver qué valores tienen. Tenemos dos métodos para hacer esto correspondientes a los dos estados, y opcional puede estar en. ¿ Eres el estado de tener una referencia válida sobre los estados de no tener ninguna referencia? Estos métodos son está presente en está vacío es un bastante autoexplicativo. Si el opcional envuelve una referencia válida es, la presencia devuelve true. Y por el contrario, si el opcional no hace referencia, un objeto valorado es retornos vacíos. Es cierto cuando te enteraste de que el opcional con el que estás trabajando realmente contiene objeto de evitar, puedes pensar todo lo que obtiene método en él, que devuelve el valor envuelto real. Sé que si llamas a ponerse en un opcional, que no se refiere a un objeto valorado, obtendrás un no punto o excepción de vuelta del FBI, así que siempre resguarda la llamada para llegar a asegurarte de que realmente haya un valor dentro. El opcional mediante pruebas está presente primero, como en este ejemplo, también se
puede ejecutar condicionalmente código basado en la presencia de un valor en el opcional. Mediante el uso del método if present. En este ejemplo, supongamos que buscamos una estrella. Empleados en la corriente vista llamando a Samir P. I. En ella regresa un opcional para indicar que pueden encenderse puede no ser una estrella. Empleados encontraron en el caso que hay uno encontrado. Se imprimirá el mensaje. Nadie al bit sobre poder establecer valores por defecto que mencioné anteriormente. Por lo que los valores por defecto aire soportados con dos métodos estos son o de lo contrario obtienen o bien suministra un valor por defecto, como en este ejemplo, tiene. Supongamos que tenemos un EPI que llamo, que da el nombre de usuario asociado a una publicación en un tablero de mensajes o feed o
stream de redes sociales . Si no hay ningún nombre presente, se usará por defecto un nombre a la Cadena Anónima. Lo usamos o método else para suministrar un valor predeterminado real en este ejemplo, donde usar u otra cosa get en lugar de suministrar el valor predeterminado tal como está u otra forma get nos
permite especificar el método o la función, más bien que habrá llamado para obtener el valor predeterminado si es necesario. Entonces supongamos que el usuario, cuando él o ella creó una cuenta, podría definir una contraseña en la que quieran usar. Si no especificó cuándo generará uno para ellos. En este caso, no
quisiéramos codificar duro la contraseña y así llamaría a algún servicio de
generación de contraseñas . Aquí la parte clave es que usamos u otra cosa get, lo que nos permite especificar, como hemos dicho, no el valor predeterminado en sí, sino el método para obtener el valor predeterminado. Esto es bueno desde una perspectiva de rendimiento. En algunos casos, por ejemplo, puede
ser útil si tienes que llamar a un servicio otros colores caros de alguna manera. Solo desea que se evalúe la llamada si el valor opcional no existe en tiempo de ejecución. No en todos los casos, como será el caso. Si pones un método de llamada, también
puedes optar por lanzar una excepción si no se da ningún valor para el opcional. Y así finalmente, tenemos un último ejemplo cuando queremos lanzar una excepción en lugar de devolver un valor. A veces no hay nada más para ello que tirar una excepción si realmente no podemos hacer prescindir del valor real. Entonces en este código tenemos un diseño alternativo para el usuario. Si el usuario no proporcionaba ninguna contraseña, no
permitían que se generara una nueva, sino que en su lugar solo ejecutara una excepción de vuelta al front-end. Para ello, utilizamos el método o else throw como se muestra aquí, por lo que probablemente puedas empezar a tener una sensación de que opcionalmente aparecen ahora mismo sobre cómo
nos lleva por el camino de producir código más agradable, más legible. Todavía no terminamos, aunque todavía tenemos el mapa condicional ings debilita debido a on. Nos meteremos en estos en los próximos videos, así que mantente atentos.
13. El mapeo y el Mapping con opcional, opcional) las: Por lo que en la última unidad tuvimos una buena introducción al uso de opcionales destapó un poco de
terreno justo en esta unidad. Vamos a subir un nivel las cosas y ver un uso un poco más avanzado. Estos aire, el mapeo y las características condicionales que ofrecen así que se convierten en algunas otras
funciones útiles que están en esta línea. Ahora vamos a ver el método del mapa. Este método nos permite mapear el valor de ratas de un opcional a parte del valor. Por ejemplo, podríamos mapear en cadena de entrada para convertirlo a mayúsculas así. Observe que la salida de la función de mapa no es el valor del mapa en sí. Este método de mapa no nos permite eludir la característica opcional, por lo que todavía obtenemos un opcional. Es solo que ahora es un opcional de ellos hasta tenerte. Esto es importante y bastante elegante, ya que significa que podemos cambiar el curso opcional del FBI juntos para hacer algún procesamiento posterior de una manera agradable, agradable,
funcional ahora que podemos mapear a cualquier cosa en el objeto lo presionó, por ejemplo Supongamos que tenemos una clase como esta para representar a una persona con un nombre y una edad que podríamos mapear para obtener justo la edad de la persona así. Esto podría no parecer tan interesante en él algunos, pero de nuevo, por el hecho de que se devuelve un opcional, podemos seguir adelante. Hacer más procesamiento para ver dónde podría ser útil esto. Para este ejemplo, este resorte está en filtros, por lo que el método de mapa mapeó un opcional de persona a un opcional de entero. Desde que vuelva Ege, un final sobre esto se caja en una entrevista tipo rápido para que tengamos este valor de mapa. Cuando es un fin, impugnamos la edad y vemos si cae dentro de cierto rango como este porque
lo mapeamos a un fin para conseguir la edad, ahora
podemos hacerlo en operaciones espaciales sobre ella. Entonces aquí estamos filtrando para sólo ver los valores que caen dentro de un cierto rango. En este caso, entre 13 y 19 podríamos tener alguna lógica, que necesita saber si John, quien tenía 21 años es un adolescente en. Podemos hacer esto ahora, gracias a que el opcional nos permitió mapear a la persona objeto para sacarle la edad de él, y luego el FBI opcional nos permitió comprobar esa edad aplicando un filtro. Hay otras formas de filtrar, pero dejaremos esas para la sección de ductos y arroyo. Pero por ahora, se
puede ver que hay una cantidad justa de energía empaquetada en un aire tan pequeño. P i en mucho más a ella de lo que las opcionales primero parecen ser. Realmente te muestra el poder del FBI opcional sobre cómo puedes usar sus métodos juntos, que es código muy limpio. Ya casi terminamos, pero solo hay que mirar un último método, y este es plano plano. Entonces, ¿de qué se trata todo esto? ¿ Ellas? Bueno, hemos visto que cuando usamos el mapa o filtro, los métodos que son opcionales siempre se devuelven en. Esto se logra mediante esos métodos de mapa y filtro. Este es el bit clave que envuelve el valor devuelto en un opcional o que devuelve opcional el vacío Si el valor era no. El motivo por el que hemos visto es que esto nos permite aplicar más operaciones al valor pasado. Por lo que mientras siempre volvamos un opcional, siempre
podemos invocar métodos en el opcional, y esto es lo que nos permite seguir adelante y cambiar esas llamadas de función juntas. Por lo que esta idea funciona bien siempre y cuando devolvamos el valor en sí del método que mapea Cole's, sin embargo, esta Channing a través de pasar siempre atrás y se rompe opcional si el método devuelve y opcionalmente en sí mismo el siguiente Jane Cole se rompería. Por lo que aquí es donde entra plano plano plano. Mapa plano no envuelve el valor de retorno y un opcional, mientras que el mapa sí. Esto lleva a las siguientes reglas. Usar mapa donde el método de mapeo que pasas devuelve el valor real en sí y usa el mapa plano donde el método de mapeo que pasas devuelve un opcional del valor real. De esta manera, nunca
contabilizarás el tema de doble envoltura sobre no conseguir nunca el horno opcional opcional. Entonces, para algunos de ellos, como ya han visto ahora, opcionales nos dan una manera poderosa de recortar mucho el código repetitivo asociado ninguna revisión puntiaguda en Hacer menos probables las excepciones de NorthPoint al obligarnos a con si un objeto puede ser no o no. Las opciones de nivel de tipo también traen consigo una aparición útil para tratar con condición , valores por defecto de
ALS , casos
excepcionales, mapeo y filtrado de una manera
ordenada, ordenada y funcional. Proporcionando limpieza ocurrió en el camino
14. 14 entender los métodos defectos: Vamos a cavar ahora y echar un vistazo a otro conjunto de características de derecho de trabajo, que nos permite poner la implementación en interfaces, a
saber, métodos predeterminados y estáticos. Ahora tienes que usar estas juiciosamente, y ciertamente no las estarás usando todos los días. Pero son cosa útil para tener tu trabajo. Ocho. Desarrollador Toolkit Ella era ellos cuando se necesitaba, así que vamos a explorar lo que son juntos. Hasta Java ocho, una interfaz consistía en métodos abstractos sólo públicos sobre eso era que cualquiera que deseara proporcionar implementación concreta de una interfaz en otras palabras, una implementación que podría ser insensible con una nueva clave palabra como esta estaba obligada a implementar esos métodos. No fue posible para ninguna forma de implementación. Para aparecer en la interfaz sobre implementaciones concretas tuvo que proporcionar todos los detalles. Dado que Java ocho interfaces ahora están permitidas para proporcionar implementación de una de dos maneras
a través de métodos predeterminados en círculo en a través de métodos estáticos, veremos los métodos predeterminados en un momento. Estos en lo más interesante. Pero por ahora, echemos un vistazo a los métodos estáticos de casos más simples. Consideremos a una persona de interfaz como esta. Esto tiene dos métodos. Una vez más, nombre completo de
una persona por el otro para obtener la edad de una persona. Ahora sabemos por la interfaz que el método get full name devuelve un stream on, podríamos tener una necesidad de proporcionar un método de utilidad, que devuelve un nombre abreviado. Por la razón que sea. Para ello, podríamos brindar implementación. En la interfaz así. Este es un método estático en acción. Es básicamente un método regular con el prefijo de la palabra estática aquí, que está proporcionando método de utilidad, que puede tomar un nombre es una cadena en retorno, la versión abreviada. Entonces no es que no nos estemos refiriendo a ninguna instancia ahí para escuchar sobre. Así es como debería ser. No tenemos datos de instancia, ya que es una interfaz. Y así este método es puramente un trozo de código, que opera de forma independiente en cualquier cadena que suceda que se pasa. Su insumo. Observe algunas cosas desde aquí. En primer lugar, significamos que estamos definiendo un método estático por prefijo en la implementación del método con la palabra clave estática. Esto es probablemente obvio, pero vale la pena señalar también porque esta estática metodista está ligada a este
tipo en ellos, por lo que no es heredada. Cualquier implementación son extensiones de la interfaz. Solo podemos llamar a persona, no te hagas abreviar, y eso es todo. Y por último, no se
nos permite llamar a los métodos en la interfaz misma, que accederían a la instancia, los datos, por ejemplo. No pudimos llamar a get full name ya que esto se referiría al estado del objeto. Sólo podemos llamar a otros métodos estáticos ya sea En esta interfaz en otros tipos, esto lleva naturalmente a la pregunta. ¿ Dónde debo usar los métodos de inicio e interfaces en la respuesta? Probablemente adivinaste por ahora son buenos para definir métodos de utilidad,
específicamente métodos de utilidad que no dependen del estado ya que extáticos para que
los métodos estáticos e interfaces sean bastante autoexplicativos y deberían sentirse bastante naturales de usar ? Echemos un vistazo a los métodos predeterminados a continuación. Aquí es donde se pone un poco más interesante con los métodos por defecto. Es el mismo concepto, en realidad. Estamos permitiendo la implementación y la interfaz, pero esta vez es a nivel de instancia. Si volvemos a considerar por una persona ejemplo, que tenía el método estático, fue un poco torpe que tuviéramos que pasar el nombre a la abreviatura get en su método . El motivo fue que estábamos definiendo un método de interfaz estática y por lo tanto uno permitía
acceder a cualquier estado de instancia. No obstante, si definimos el método de interfaz de instancia un llamado método predeterminado, entonces podemos acceder a métodos sabios de instancia y así podemos cambiar la implementación para llamar a un método de
instancia en la interfaz misma así. Es un factoring re menor pero hace toda la diferencia. Ahora está muy claro que el método está diseñado para operar en el campo get full name, ya que en realidad estamos usando ese método en el propio método predeterminado. Es bastante bonito que podamos hacer esto ya que hace nuestro intenso, mucho más claro Tomemos un minuto para notar las diferencias del
método estático Inter First Implementation two created evil method. Prefijamos la definición del método con la clave predeterminada lo haría. Y, como dijimos, ahora
podemos llamar al get full name con Atsu I. Podemos llamar a métodos de instancia dentro de la definición del método. Además, no es que los métodos predeterminados no solo estén disponibles en el tipo de interfaz en sí, sino que también estén disponibles en cualquier extensión de esa interfaz. ¿ Son ustedes las clases que amplían o implementan esa interfaz? El beneficio clave por encima de los métodos estáticos inter primeros en D cuatro métodos es que te
permiten agregar comportamiento a las interfaces que ya están ahí fuera en la naturaleza, ser
utilizadas por cualquiera de tus clientes del FBI sin romperlas. De hecho, sin esto, la adición de uno de los mayores beneficios de Java habría sido imposible. Esas son las capacidades de las colecciones de stream para permitir que se procesen de
manera funcional a través de ductos o colecta. Ahora las clases tienen un método de flujo agregado a ellos en Job ocho, que aparece casi por magia sobre que la magia se logra a través de métodos predeterminados. Había una forma de mejorar todos los tipos de colección sin romper a los clientes existentes algunos otros puntos en torno a los métodos predeterminados antes de que termináramos. En primer lugar porque Steve, ¿qué métodos proporcionan implementación? No necesitamos implementarlos como lo hacemos con los métodos de interfaz normales. Esto es algo intuitivo ya que ya están implementados. No obstante, debido a su implementación, tenemos la opción de anularlos si elegimos en subtipos en un punto más sutil, porque podríamos extender o implementar múltiples interfaces, es técnicamente posible que podríamos implementar a inter versos que pasaban a tener el mismo método por defecto. Utilizo un nombre de método devuelve cualquiera de los argumentos del método. Si esto sucede, el compilador no sabe qué hacer y nos requerirá que brindemos nuestra propia implementación para evitar ambigüedades y resolver la situación. Esto es altamente improbable, pero vale la pena señalarlo, sin embargo, acaso. Entonces, como hemos visto, permitir interfaces de implementación proporciona una buena manera de empujar el comportamiento genérico en ellas sin interrumpir las implementaciones existentes. Quién podría simplemente beneficiarse de, o incluso sonar,
el ignorar el nuevo comportamiento, que se les empuja en su compra re forma compatible. Esta es también la magia que permite que las colecciones Java se mejoren con la corriente mejores capacidades de
programación bajo el capó. Lo que está preservando la compatibilidad con versiones anteriores con el costo de código existente de hecho, pero probablemente más para la evolución de opioides públicos y carding día a día pero una herramienta útil para tener en tu Conan lo tomó sin embargo.
15. 15 comprender las referencias del método y sus diferentes tipos de método.: con SIDA laboral abriendo la puerta al mundo de la programación funcional, puedes imaginar que ya serían toneladas de métodos, que podrías usar en un contexto funcional. Por supuesto, la pregunta es, ¿Cómo se hace eso? Bueno, los diseñadores de idiomas
también han pensado en esto . Conforme sucede en DSO en Java, se han introducido
ocho referencias de métodos, lo que nos permite hacer precisamente esto mismo referencias de métodos o un nuevo trabajo de presentación. Ocho en. Nos permiten referirnos a un método existente en un contexto de expresión lander. Vamos a tener un resumen rápido de Landers e interfaces de funciones en Java ocho para que podamos poner mis otras referencias en contexto. En primer lugar, aquí hay una expresión prestamista. Esto tomará una cuerda y se imprimirá al cónsul cuando sea invocado. Nada de fantasía. Es sólo un sistema fuera de línea de impresión, que lleva el mensaje a Prince. Todo necesita un tipo en Java, y así hemos visto que podemos asignar esta expresión maderera a una interfaz de función como esta. Entonces lo que realmente estamos haciendo aquí, su empaquetado de alguna implementación en este caso, una declaración de línea de impresión del sistema que imprimirá algún mensaje al asignarlo a una interfaz
funcional. Podríamos asignarlo a cualquier interfaz funcional que coincidiera con la firma
del método empleado del lander que utilizaría aquí una de las interfaces de función estándar, lo que significa que una función que toma el valor es entrada pero les devuelve salida. Se trata de un consumidor. Consume el parámetro de entrada. A través de esto, hemos capturado la función pero aún no la hemos invocado. Entonces podemos hacer eso con bastante facilidad así. Ahora estamos aplicando la función, el consumidor pasándola por alto. En lo que necesita su sencillo parámetro es requerido por la interfaz funcional del consumidor al ejecutar esto, se imprime
el mensaje. Ahora, cuando tienes una expresión Lunder que solo causa un método existente, puedes usar una referencia de método en su lugar. Entonces para tomar las dos líneas de código que acabamos de escribir juntas, que se ve así cuando lo vemos lado a lado, éstas podrían ser reemplazadas por esto. Entonces, como puede ver, hemos sustituido esta expresión de Lunder por esta referencia de método. Se trata de una referencia a la línea de impresión de método estático definida en el sistema a nuestro objeto. Ahora bien, esto debería sentirse bastante intuitivo una vez que tengas la cabeza alrededor de expresiones de lander e interfaces
funcionales. Todo lo que hemos hecho es intercambiar el Lambda por una referencia al único método llamado que hace en esta etapa. No, ya
has visto lo fácil que es. Vamos a cavar un poco más profundo en Mira los diferentes tipos de referencias de métodos que tenemos a nuestra
disposición lo horrible de lo mismo general desde el sexo con el doble colon que separa el tipo u objetos en el método. Pero vale la pena repasar los cuatro tiempos de referencias de métodos que tenemos ahora una rápida palabra de advertencia. Si lee alguna documentación el sitio web de Oracle sobre referencias de métodos, verá que utilizan, um, definiciones
bastante confusas y redactadas. Por lo que voy a dar estas definiciones aquí ahora en los puntos de bala pasarán. Pero como te explicamos cada uno, voy a dar un claro y M para cada uno para que puedas sostenerlo más fácilmente en tu memoria sobre entender qué es. Entonces no entres en pánico. Estos van a sonar horriblemente complicados, pero no está tan mal una vez que veamos en qué está cada uno. Cuando miramos los ejemplos, debería quedar bastante claro que estos tipos de referencia de métodos son los obvios que
deberíamos tener de todos modos. Tan profunda respiración ahora colgando ahí. Los tiempos de las referencias de métodos son los siguientes una referencia a un método estático, una referencia a un método de instancia en un objeto particular, una referencia a un método de instancia en cualquier objeto en la referencia a un constructor. Aquí hay mucho, así que veamos ejemplos uno por uno. En primer lugar, veamos las referencias de métodos estáticos para esto. Consideremos el método estático Parsons en la entrevista de clase. Este juego se representa como un método de referencia como este. No, ya que el método parson toma una cadena en retornos y extremos, podemos usar la función de tipo string e interject para hacer referencia a ella para que pueda ser asignada y almacenada así. También, como breves puntos laterales notan que el método parson real devuelve una primitiva en tipo. Pero se nos permite usar la función, que referencias que ingresaron a tu tipo rápido. Ya que el resultado será alter box para nosotros desde lo primitivo hasta la referencia en tu apetito, es bueno saber que el auto box y la característica todavía juega muy bien con todo este
material funcional que se ha agregado al plataforma de todos modos. Una vez que tengamos el método de referencia, podemos invocarlo así. Aquí estamos pasando en la cadena, literal 35 al recuperar el valor real como esperábamos. Entonces hay un método estático referencias, que usamos cuando nos referimos a un método estático en la clase al reutilizarlo en un
contexto funcional . A continuación, tenemos instancia, referencias de
métodos, y hay dos veces de estos enlazados y desvinculados, como veremos ahora. Mientras que una meta referencia estática se refiere a un método estático en una clase, estos tipos de referencias de método estos llamados instancia cumplieron las referencias se refieren a un método de
instancia en la clase. Dado que tenemos una referencia a un método de instancia, en última instancia
necesita ser invocado contra alguna instancia real. Ahora podemos elegir si creamos la referencia del método para referirnos a una instancia real, cuando el método hace referencia definido. Este es el tipo delimitado, o podemos elegir si posponer esa letra del dedo del pie vinculante y no especificar la instancia. Este es de nuevo el tipo sin fundamento. Algunos ejemplos deberían dejar esto claro. Toma la búsqueda de cuerdas. Esto define un método a mayúsculas, que opera en una cadena. Instancia, Es un método de instancia. Si tenemos un objeto de cadena existente, querría invocar la referencia del método contra Podríamos suministrarlo así. No es que no utilicemos el nombre de clase de cadena cuando declaramos la referencia del método, sino que nos referimos a una variable real que contiene una instancia de cadena. Esta es la razón por la que ahora es colon de minúsculas s a mayúsculas, ya que estamos invocando una referencia de método contra una instancia específica, Este método hace referencia a un proveedor el cual devuelve una cadena por lo que podría asignarse y almacenarse así que en alguna etapa se puede invocar realmente para obtener el resultado así devolviendo la versión capitalista de la cadena. En este punto, podrías estar pensando, no lo entiendo. ¿ Por qué el método a mayúsculas es un proveedor? Es descaradamente una función que toma una cadena en los retornos. El versión mayúscula, que también es una cadena por lo que seguramente debería ser función de string string. Entonces, sí, tendrías razón para una referencia de método de instancia fuera del tipo sin límite donde no
proporcionamos la instancia al declarar la referencia del método. En ese caso, sí, toma una cadena y devuelve una cadena en DSO es una función de cadena de cadena, pero no, por ejemplo, referencia de
método del tipo delimitado, ya que, en este caso, donde enlazar la instancia real, se invocará
la referencia del método con cuando declaremos la referencia del método en sí y así no toma una entrada, simplemente devuelve la salida en cualquier cosa que solo regresa. La salida es un proveedor, por lo que en este caso es un proveedor de cadena. Entonces solo para repetir que es bastante importante con la instancia sin límite. Referencia del método. No hay contexto asociado a la referencia del método. No hay objeto. Basta con mirarlo. Es cadena con colon de colon mayúscula a mayúscula. No hay nada sobre una instancia real en esta definición, y así cuando la invocas, necesitas la cadena para invocarla contra, y luego devuelve la versión en mayúsculas. Entonces cadena adentro, cadena hacia fuera. Esa es una función entonces, así que función de cadena de cadena, pero con la referencia del método de instancia enlazada. Nos ocupamos. Tener contacto arranque en contra de ella. Esto lo proporciona la instancia contra la que se ha invocado el. Entonces esto es como tener una función que ya se llenó con su entrada. Entonces debido a esto, la referencia al método a mayúsculas ya no es una función ahora. Ya ha tenido su set de entrada. Cuando creamos el método de referencia. Como puede ver, creamos la referencia del método especificando la instancia contra la que se va a invocar, y así simplemente devuelve el valor en. Por esa razón, es un proveedor, que es la interfaz de funciones con solo retornos. El valor en no toma ninguna entrada. Por cierto, cuando llenas parcialmente los argumentos para una función, técnicamente creas otra función vinculando uno o más de sus parámetros de entrada como hemos estado aquí. Ese siete para esto es currying la función. Está bastante avanzado son y no queremos conseguir derechos secundarios. Pero pensé mencionado en caso de que alguna vez escuches este término en el futuro. Ahora ya sabes lo que significa. De todos modos. Agarremos y tomemos un poco de respiro ahora con algo que finalmente es fácil de
entender las referencias de métodos construidos. Entonces Leslie entonces hemos construido con referencias que, como dije, Kim era un precio Pleasants. Ya que son fáciles de entender las noticias, esto es solo una referencia de método que expresa un carbón a un constructor como cuando se invoca al nuevo operador para crear un nuevo objeto de un tipo de clase dado. Por ejemplo, si considera lo construido para crear una lista vinculada de cadenas, su referencia de método correspondiente es esta. Podemos asignarlo y almacenarlo así. Se trata de un constructor, por lo que va a devolver como valor,
es decir, la instancia de la lista que se está creando para que podamos escribirla a un proveedor de lista. En los retornos de estado específicamente es una lista de cadena. Por último, podemos invocarlo para obtener la lista así. Observe que el inter fúngico primero para referencias de métodos constructivos es un proveedor sobre esto no
toma argumentos y simplemente devuelve algo. Entonces esto significa que sólo se puede llamar constructores de ningún argumento. En otras palabras, el Defoe básico construye que obtienes en Java, que no toman argumentos a la hora de construir los objetos. Es una limitación, sí, pero ahí está. Bueno, eso fue bastante terreno que cubrimos en este módulo. Como puede ver, las referencias de
métodos responden mal. Una vez que los cuelgues, solo
tienes que considerar en qué objetivos pueden estar las esperanzas. Esto se deriva de su contexto. Una vez que las tengas, puedes utilizarlas dondequiera que se puedan utilizar expresiones lander. En. En particular, los
verás usados mucho en ductos donde la mejor programación de stream entra en juego con las opciones. Del FBI, también. Ahora que puedes detectarlos, deberían ser fáciles de trabajar con
ellos como has visto de manera elegante en Job ocho de referenciar métodos ya existentes en un contexto funcional.
16. 16 introducción de Java 8 la codificación de la codificación 8: ahora que hemos pasado por las tuercas y pernos de Job ocho sobre la teoría detrás de todos los diferentes conceptos en esta sección, vamos a perforar, echar un vistazo a cómo realmente codificamos eso en nuestro I DS. Ahora voy a estar usando idea inteligente para hacer esto, pero los ejemplos funcionan igual de bien en Eclipse o cualquier otra idea que tengas estaban mirando a través de los procesos de pensamiento que atravesamos como pudimos sobre cómo podemos usar las
características I D para hacer cosas un poco más fáciles para nosotros cuando se trabaja con código de escritura Java. Sobre todo, la estará mostrando las características de los hombres en contexto para que podamos tener una mejor comprensión de exactamente cómo funcionan. Entonces lleguemos a ello.
17. 17 un vistazo a la API de las interfaces funcionales: en este video, vamos a ir un poco más profundo y explorar algunas otras interfaces funcionales que se encontrarán Así que hay muchos tipos diferentes de interfaz de funciones en el Java que util paquete
funcional. Pero de todas esas, hay algunas interfaces de función que son solo interfaces de núcleo, que simplemente hay que saber por los muchos tipos diferentes de
interfaz financiera . Estos airean más o menos proveedores, consumidores, predicados, funciones y operadores. Entonces vamos a explorar con enorme uno es ahora. A su vez, solo
echemos un vistazo rápido a la función Java util dot Docks Java para ver qué
interfaces de funciones tenemos realmente disponibles. Eso son bastantes. Por lo que esta es la página de doc de trabajo para Java Util que funcionan en Puedes ver la parte superior. Dice que las interfaces de función proporcionan tipos de destino para expresiones lambda y
referencias de métodos , lo cual es cierto. Eso es lo que hemos visto a lo largo de este curso Ahora. La primera vez que vi esto, me siento un poco abrumado, para ser honesto, porque hay tantas cosas. Hay tantos tipos diferentes, y todos parecen tener nombres bastante confusos tanto. Los servicios estadounidenses son los de Andi cuando primero cómo puede ser difícil de entender o apreciar por dónde se puede incluso comenzar. Entonces, solo echemos un vistazo a lo que realmente tenemos aquí,
porque en realidad no es tan difícil cuando miras lo que realmente han proporcionado. En segundo lugar, tenemos cosas como consumidores, funciones, operadores, predicados, proveedores. Pero entonces verás solo tipo de repeticiones operador de consumo,función de
consumidor, función de
consumidor, suministro de
predicado, una función de función, función de
operador y así sucesivamente. Entonces, ¿realmente solo tienes estos cinco tipos de interfaz funcional núcleo que he dicho antes, que un proveedor de consumo preconizaba función y operador dentro de este paquete? Bueno, en realidad
han producido son un conjunto de interfaces fúngicas, que se utilizan dentro del propio Jedi K. Por lo que estos fueron los más comunes que el propio código Jedi K utiliza en realidad. En el marco de esto. Ya sea han proporcionado tipo de función específica Versos Inter, por ejemplo, operador binario
doble, doble consumidor inspirador operador Double Eun Rhee. Operador. Ese tipo de cosas. Estos suelen prefijarse con el doble o el final de esos tipos primitivos o nos han dado interfaces genéricas en. Ahí es donde tenemos que proporcionar un tipo cuando usamos esa interfaz fúngica. Obviamente, no
es posible para ellos predecir todos los tipos de interfaces de funciones que
necesitarás . Por lo que proporcionar los primeros genéricos nos da un camino a través de los genéricos o les regala tres dinámicas, más bien o ser capaz de proporcionar la forma de interfaces de función si lo desea. Y entonces estos podrían ser reutilizados en otros proyectos de terceros como nuestros proyectos, por ejemplo, en todo lo que tenemos que hacer es enchufar los tipos reales que queremos usar este conflicto
clases personalizadas , por ejemplo, como departamento de empleados de Persona, ese tipo de cosas. O podría haber otros tipos utilizados ya sea en el Jedi K o de los paquetes de código abierto. Entonces, por ejemplo, string no encontrarás ninguna interfaz de función basada en cadenas aquí. Entonces, veamos cada interfaz de función de llamada a su vez y hablemos sobre cómo se usa cada una. Entonces en primer lugar, podemos ver al consumidor aquí. Entonces consumidores, si hago clic y consumidor y si miras la firma del método real aquí, puedes ver su función. Descriptor es tal que toma un parámetro de entrada de cualquiera que sea el tipo de interfaces de disfunción involucradas en él devuelve vacío y también se puede ver debajo que incluso se puede encadenar los consumidores juntos. Entonces al igual que vimos cuando se pueden encadenar llamadas opcionales juntas, porque en los casos en que un opcional regresa en la espalda opcional o,
por ejemplo, por ejemplo, donde una operación intermedia en la canalización y el marco de flujos devuelve una secuencia de vuelta y puedes seguir adelante cambiando esos métodos, Cole's De igual manera, puedes hacer lo mismo con los consumidores también, aunque eso está fuera del alcance de este curso. Pero es algo a mirar si quieres llevar las cosas más allá. A continuación que tenemos es una función, pero llegaremos a eso una segunda causa. Es un poco más complicado, y en su lugar recurriremos a proveedor. Aquí. Nosotros decimos que está representando a un proveedor de resultados, y es cierto. Entonces qué suministro de aire es es que acaba de devolver algo. No toma ningún parámetro de entrada. Acabas de devolver algo y puedes ver aquí. Si hacemos clic en este método get, podemos ver aquí que no toma nada. Estos paréntesis vacíos aquí, pero solo devuelve un valor del tipo de parámetro. Ahora echemos un vistazo a la función de función en el espacio. Se puede ver función representada que excepto un argumento en produce un resultado. Y de nuevo vemos podemos componer funciones como vimos antes con la
interfaz funcional del consumidor lo verás en la parte superior ahí, tenemos esto y luego método, pero podemos pasar en una función para que usaran para componer funciones juntas. Cuando estás componiendo funciones juntas, donde vas a invocar una tras otra, crees que suena llamadas funciones de orden superior. Es solo una forma de tener reusabilidad, pero un nivel de función que es bastante agradable. Pero otra vez fuera del alcance de este curso, este curso introductorio. Pero es algo que buscar si quieres llevarlo ese siguiente paso más allá. De acuerdo, entonces el método de los hombres Hey nos interesa es una estratagema para que pueda postularme. Ya ves, aplica disfunción al argumento dado sobre lo que eso significa es tomar la entrada y devolver algo de salida desplazándose hacia abajo más. Tenemos este predicado aquí en un predicado, básicamente es una interfaz de función donde se necesita un argumento para tomar alguna entrada en
devolverá un booleano verdadero o falso. Entonces este es el método de prueba aquí. Predicados usaban mucho en stream mejor procesamiento cuando queremos filtrar elementos. Entonces eso te da una introducción muy rápida a las interfaces de funciones, las
cuales están disponibles en el trabajo que le dijiste a ese paquete de funciones y te da una idea de dónde buscar, para entender cómo funcionan para que puedas usarlas en su trabajo de proyectos. En los próximos videos se verá cómo usar estos, en
realidad en la práctica en tarjeta.
18. 18 codificar y referenciar una expresión Lambda simple: Entonces en este video, vamos a pasar por algunos conceptos básicos con expresiones Lambda e interfaces funcionales. Ahora en las partes anteriores del curso hemos introducido bajo expresiones por separado de interfaces
funcionales en. El motivo es porque son un poco diferentes. La sintaxis es, si se quiere, las expresiones
Lambda son básicamente métodos que se pueden enchufar. Dos lugares donde se esperan intérpretes funcionales en interfaces de embudo proporcionan los tipos de
destino para ese mecanismo. Entonces lo que queremos decir con Tipos de Target es que las interfaces de función pueden ser ya sea los tipos reales . ¿ Asignas una expresión lambda a o los tipos a los que pasaste bajo expresiones, Method dice que esos son los dos casos de uso de hombres para interfaces funcionales, Así que echemos un vistazo a los dos de esos ahora en adelante. DWI los puede ver si hacemos alguna codificación, y si los demostramos al mismo tiempo, será fácil ver cómo encajan. Entonces pon las cosas en mucho más de un contexto concreto. OK, así que primero, empecemos con la expresión básica más simple. Se puede tener la expresión de lander más básica, así que si entramos en la estática, evitamos el método de modificación, solo podríamos usar esto por ahora porque no tienen ninguna instancia Estado en esta
clase demo en la que está, solo estamos mostrando algunas cosas que podemos hacer con bajo expresiones e interfaces de funciones, por lo que no necesitamos que sea como una clase adecuada. Entonces esto está perfectamente bien. Pero en el método principal, así puedo crear la expresión Lunder. Muy sencillo. Bajo expresión como esta. Empieza con algunos paréntesis, operador de
flecha y luego una declaración hola mundo. Por lo que esta es la expresión de lander más básica. Tenemos paréntesis vacíos al inicio porque no toma ningún parámetro. Se recuerda lo que tenemos en la sección de paréntesis de básicamente los parámetros de entrada y opcionalmente tipos de parámetros a para los corderos o expresión on porque no tenemos nada dentro de esos paréntesis. Eso significa que no se necesita nada. Esto bajo expresión no toma ningún parámetro. Entonces tenemos la flecha ahí, que luego apunta a lo real bajo expresión misma, que en este caso, es solo una declaración que invoca el método de la línea de impresión en los sistemas fuera a decir hola. Y en este punto verás que no podemos sólo tener una expresión lander independiente, por lo que ya se quejan los compiladores. Se puede ver esto rápidamente, línea
roja debajo. Entonces si pasamos por aquí, es decir que la expresión del lander en sí Así que esta expresión completa no es una declaración en . Eso se debe a que no tiene sentido tener una expresión Lambda, que es sólo una especie de ahí fuera. De pie libre, no ser pasado a nada no se le asignó a nada simplemente no tiene sentido. Entonces, por lo tanto, para hacer esto completo en una declaración adecuada, necesitamos asignarlo a algo, por lo que lo asignamos a una interfaz funcional. Ahora bien, si miramos esto bajo expresión, como hemos visto, no toma ningún parámetro de entrada, pero no devuelve nada. Por lo que eso significa que podemos asignarlo a un método que no tiene parámetros de entrada sobre devoluciones vacíos. Como dijimos antes, si miras la interfaz móvil, solo
podemos echar un vistazo rápido Ahora Entonces puedes ver aquí esto cumple con la factura. Esto va a ser compatible. Es una interfaz funcional. Está anotado con su anotación de interfaz funcional aquí, lo
que significa que solo va a tener un solo método abstracto que hace, que es aquí este vacío abstracto público volver a correr. El descriptor de función del método incorrecto coincide La función se despoja de la
expresión lander que tenemos, porque aquí no pasamos nada al método es parámetros de entrada igual que aquí. No pasamos nada a expresiones de Londres, parámetros
de entrada y de igual manera, también está volviendo vacío el. Tampoco estamos devolviendo nada aquí, Así que esto significa que puedo tomar esta carrera Herbal, copiarlo en referencia de servicio. Y debería poder hacer esto cuando pueda. Por lo que este punto, tenemos una declaración completa para que puedan ver aquí. Obtuvo la interfaz de funciones a la izquierda como hora objetivo para la expresión londinense. Tenemos la expresión prestamista en sí, que está aquí en tenemos esta asignación a la variable, por lo que f n así en este punto, una vez que se ejecuten estas líneas, esta variable FN mantendrá una referencia a eso bajo expresión. Ahora, porque ahora hemos escrito esta expresión de Lunder a la interfaz funcional rentable, esto significa que entonces podemos invocar el método para effin dot run. Y si hacemos esto, veremos que el comportamiento que fue encapsulado dentro de esta variable que sostenía la expresión
Lambda, realidad
se invoca en otras palabras. Se va a ejecutar este trozo de carta aquí a menos que todo el punto de Lambda Expressions pasara realmente por trozos de carta, como hemos dicho antes. Entonces solo para demostrar que si hago click derecho y te atropellas a mis hombres, deberíamos esperar ver hola impreso o puedes ver que está impreso la cuerda. Hola, Así de seguir adelante. Si quiero hacer esto más avanzado, quiero agregar algunas cosas extra aquí, tal vez otra línea a que no tengan que ponerlo dentro de llaves y terminar con una semi columna. En este punto, tengo la capacidad de proporcionar múltiples líneas dentro de esta expresión de lander. Entonces, por ejemplo, aquí podría decir nombre de cadena igual a mutt en Hola, Eso es un cuchillo. Vuelvo a correr. Deberíamos ver Hola. Mapeo producido. Entonces esa es la forma de poder tener múltiples líneas en su interior. Todo bajo expresión. Ahora, en general, quieres tener tus expresiones de prestamista lo más concisas posible. Por lo que realmente quieres estar inclinado más hacia expresiones como un liners. Si te gusta la perspicacia, expresiones
lander en lugar de tener muchas declaraciones diferentes dentro del cuerpo de una expresión
Lambda que generalmente se considera mala práctica. No obstante, está ahí si lo necesitas, por lo que vale la pena señalarlo también. Entonces esa es una buena introducción a Lambda Expresiones, sintaxis y cómo podemos asignar expresiones Lunder a interfaces de funciones en. En los próximos videos cavarán un poco más profundo y llevarán las cosas al siguiente nivel.
19. 19 factoring de una expresión lambda mediante adaptar una Interface funcional existente: De acuerdo, así que hemos visto ahora básicamente bajo expresión. Entonces veamos ahora algunas expresiones numéricas, que era diferentes interfaces funcionales. Entonces si sólo estamos pasando en un parámetro, entonces no tenemos que usar paréntesis. Sólo usamos paréntesis si alguno de ellos pasaba múltiples parámetros, en cuyo caso tenemos esos parámetros separados comas como un B c de ese tipo de cosas, o en el caso en que no tengamos parámetros en absoluto. Entonces se tenía que tener algo ahí en ese caso, por las formas en que no es posible por el compilador. No obstante, si sólo tenemos un parámetro, que se pasa, entonces no tenemos que usar los paréntesis. Entonces hagámoslo ahora. Pasemos el nombre a la expresión maderera, así que vamos a deshacernos de eso y nos desharemos de esos dos. Simplemente tenemos un simple liner bajo expresión, y se podía ver en este punto que no funciona. Entonces, pasemos el rato y veamos por qué. Dice tipos de parámetros incompatibles en la expresión Lambda. Número incorrecto de parámetros esperado cero encontró uno. Y la razón de eso es porque el compilador está comprobando aquí esta expresión de Lunder. El descriptor de función de aquello que sabe toma una cadena como parámetro de entrada, y la razón por la que sabe que es una cadena, por cierto, es por el contexto dentro del cual se usa aquí. Entonces el compilador com'on más tipo porque trabajando cadenas cautivadoras aquí, sin embargo, ese descriptor de función, que toma una cadena, no es compatible con increíble. Y eso es porque amenable. Estar buscando aquí. No se necesita una cuerda. Entonces si pudiéramos modificar eso y poner en cadena, lo que podemos causar que sea lectura de su padre sólo entonces lo arreglaría. Entonces hagamos algo parecido. Sólo copiemos eso. Por lo que copiamos esa interfaz escriturable hablando aquí. Llamémoslo otra cosa. Vamos una cuerda rentable. Es un nombre horrible, pero sólo por el bien de la demo y borrar la charla de trabajo. No necesitamos eso. Entonces si pudiera ser cuerda ganable aquí, él tendría las mismas eras que teníamos antes. Pero ahora verá si hago esto al actualizar ese método en la interfaz de funciones para tomar una cadena. Ese error ha seguido ahora. El aire se ha ido ahora porque efectivamente, cuerda ganable su función. Descriptor toma la fuerza en el bajo expresión. También Texas durante el cual está aquí es su nombre. Por supuesto. Ahora tenemos un problema aquí sobre el tema aquí donde está diciendo cadena de ejecución en cadena, escritable no se puede aplicar y hay esos paréntesis vacíos. Lo que están diciendo es que no se puede invocar este método ahora sin pasar algo. Eso se debe a que efectivamente tiene que tomar parámetro de entrada. Tenemos que pasar en el nombre. Entonces ahora nosotros para ti escribiendo Matt. Todo se compila. Y eso es porque ahora estamos pasando el parámetro string. Cuando invocamos la función que se lleva a cabo en esa expresión maderera en todo, mucho es muy bien los descriptores de función coinciden con las firmas del método. Pasaban en mucho los parámetros. Todo está bien menos un cuchillo. Yo sí controlo nuestro para correr. Entonces obtenemos el mismo efecto que antes, así que ahora obtenemos el mismo efecto. Todavía dice:
Hola, Hola, Matt, pero es solo que lo tenemos de una manera diferente. ¿ Qué tipo de arrecife actuó las cosas a la ligera? Todos los reelaboraron más bien sociales. Hemos adaptado la interfaz de funciones para satisfacer la necesidad de la expresión lander. En otras palabras, una expresión lander tomó un parámetro de entrada, Así que adaptamos la interfaz fúngica para tomar ese parámetro. Esto también te muestra, por cierto, cómo crear una interfaz de función. Aquí se puede ver. Tenemos esta interfaz de función de aplicación saneamiento solo declara que es una
interfaz funcional en Tenemos este método abstracto aquí, Interfaz
tan amigable en general solo siempre tiene un método abstracto de lo llamado método
abstracto único y opcionalmente. Se puede pasar en esta anotación de interfaz de función en la propia interfaz. El rostro de funciones no necesita que no necesite esa anotación. Pero es solo la búsqueda del compilador puede captar cualquier error. Entonces, por ejemplo, si empiezo a agregar un método aquí como so string do saludo, entonces vamos a obtener este compilador aquí, dice múltiplo, ninguno de escribir métodos abstractos encontrados en la interfaz sobre lo que ese significa, básicamente es no poner más de un solo método abstracto en la interfaz de Fox. De lo contrario, no es interfaz de función, así que dado que eso está todo bien, por lo que en este video hemos visto cómo podemos tomar un refectorio de expresión numérica existente para pasar en un parámetro de entrada y crear o adaptar existente interfaz de función para proporcionar un tipo de
objetivo coincidente para esa expresión de lander en. Como puedes ver, no
es demasiado difícil de hacer. Y a medida que te vuelvas más seguro con las interfaces de función en las expresiones bajo, encontrarás que es bastante fácil si usas las interfaces de función existentes del paquete Java Util ese de funciones, también conocido como interfaces de funciones de Irán como que hemos visto aquí.
20. 20 cómo proporcionar tipos de Interface funcionales alternativos para una expresión de la expresión Lambda: lo último que quiero mostrarles es el hecho de que la expresión lander en realidad se puede usar con múltiples interfaces de función no solo está ligada a una interfaz financiera específica. Se puede utilizar con múltiples. Entonces veamos que ahora Recreemos lo que teníamos antes. Originalmente. Se puede ver que conseguimos esta simple bajo expresión. No toma ninguna entrada, no devuelve nada. Decidimos correr un balón. Sabemos cómo funciona eso Ahora. Eso está bien. Si creamos nuestra propia interfaz de funciones. Ahora vamos a ejecutarla y darle un método que tenga la misma función. Descriptor. Llamémoslo ejecuta y solo por integridad. Pero su función en el saneamiento espacial en tan solo una especie de doble chequearlo cuando hemos
hablado con él. Ahora aquí hemos creado una nueva interfaz de funciones y él tiene un método diferente. Por lo que este método es un nombre diferente. Se llama ejecutar. El increíble se llama Run. No obstante, tienen el mismo descriptor de función. Por lo que no toman parámetro de entrada ni ningún parámetro de entrada y no devuelven nada. Entonces esto significa, bastante sorprendentemente, tal vez, que yo podría hacer esto. Ejecutar er él estaba en el que acabo de crear ahora en mi paquete, no el trabajo de movimiento ustedes dos función concurrente a igual y luego copiar esta misma
expresión de Lunder , y se puede ver que está completamente bien también. Y esto es algo lindo de Lambda. Las expresiones eran realmente solo empaquetar un trozo de código, y les doy la capacidad de pasarlo al contexto que encaje. Por lo que sólo quería señalar el hecho de que se pueden asignar expresiones a un prestamista en muchos diferentes inter versos fúngicos. No es sólo un mapeo 11 entre una expresión maderera específica necesita tomar una interfaz
focal específica . No es que sea mucho más flojo, como hemos visto, y cuando estás expuesto a esto cuando solías después de un tiempo, obviamente un poco de cambio de paradigma. Pero cuando estás expuesto a eso y te has embarcado mentalmente, entonces realmente te permite empezar a pensar en cortar a un nivel funcional, que es uno de los grandes beneficios del trabajo como hemos visto
21. 21 refactoring de una expresión de Lambda con su referencia del método: Entonces en este video, vamos a echar un vistazo a las referencias de métodos en Ver cómo podemos usarlas en acción, ya que podría ser un poco abstracto a veces un cesado cuando por primera vez comienzas a ponerte la cabeza alrededor de ellas. Y así solo los demostremos aquí podremos ver de primera mano exactamente cómo funciona el trabajo. Entonces, comencemos mirando una simple referencia de método. De acuerdo, entonces ya hemos visto la interfaz del consumidor antes. Esa es una interfaz de función del consumidor que es. Entonces si consigo ahora Consumer Hope String, solo importa eso, solo
diré que esto es Greta de acuerdo para funcionar ahora. Ya hemos visto antes en la seccional bajo expresiones que podemos asignar una expresión prestamista a la interfaz de funciones, y sabemos que la interfaz del consumidor excepto el parámetro pero no devuelve nada. Así que basta con comprobar dos veces que si tocamos comando y hacemos clic en el consumidor y echa un vistazo a la interfaz que podemos ver aquí abajo. Tenemos este método excepto. Entonces, excepto una oferta de parámetro dado tiempo que se invoca con en él no devuelve nada, así que si pudieras cerrarlo, podríamos pasar en una cadena tan saludo en el cuerpo del bajo expresión apenas sobre imprimir línea. Simplemente debo señalar el saludo en sí desde pit print, cualquier otra cosa con un punto y coma para terminar. Por lo que en esta etapa hemos visto la expresión prestamista, que podría asignarse a una interfaz fáctica correspondiente en. No hay nada sorprendente en eso. Hemos visto ese tipo de cosas a lo largo del curso, así que usando referencias de métodos, en realidad
puedo volver hecho a esto. Entonces, en lugar de poner aquí la expresión prestamista, simplemente
puedo quitar eso y cambiarlo a esto. Y esta es ahora la referencia de método correspondiente. Por lo que la referencia del método que corresponde a eso bajo expresión. Y por cierto, si solo lo escribo desde cero así sistema a fuera llamando a Colón, entonces cuando pongo el segundo frío y ahí se puede ver Intelligent nos da una lista de métodos que están en los outs, objetos dentro de la clase de sistema. Entonces se desliza con, me gusta imprimir línea. Entonces sin embargo lo llegues, ya sea que lo escribas directamente desde el mito de la referencia indirectamente, es
decir, o si comienzas con el bajo expresión y luego vuelves a fábrica después del hecho al método
correspondiente hacer referencia a los efectos. Lo mismo a la parte clave aquí es que podemos utilizar un método de referencia en lugar de la
expresión lander y luego eso se le asigna a la interfaz de función correspondiente. Por lo que podría entonces llamar al método con excepto pasando en este texto aquí. Si ejecuto eso, veremos que se ha invocado porque aquí hola de una referencia de método. Entonces eso es sólo una demostración de un factoring re muy simple debilitar debido a reemplazar una expresión de lander
existente por su referencia de método correspondiente. Ajustar este tipo de pequeños anillos de hecho re a medida que avanza. Haremos que abrigue incluso más limpio dice que podría practicar para meterse, pero
también es más conciso .
22. 22 codificación con la interfaz funcional del cliente: Entonces vamos a escribir algo de corriente ahora usando la interfaz de función del consumidor, así que volví a la i. D. Puedo escribir al consumidor fuera de la inteligencia de cadenas está sugiriendo que importe eso, lo cual es cierto. Esa es la función en el espacio-tiempo, el trabajo que dijiste paquete de funciones o interfaces financieras. Aaron ese paquete, por cierto, al
menos un conjunto común, aunque hay otras interfaces de función dispersas alrededor del Jedi K como en la interfaz
Venable que vimos antes. Por lo que hago todo centro para traer lo importante. Entonces ahora, si voy al consumidor, se
puede ver excepto un parámetro de entrada. Entonces esto significa que mi expresión Lunder necesita aceptar un parámetro on. En este caso, va a aceptar una cuerda. Entonces aquí tenemos un parámetro de entrada frutas, y simplemente hacemos esto fuera línea de impresión otra vez, que dicen es mis frutas favoritas es, y luego lo prometedor este pasado él. Entonces sabemos que podemos saber invocarlo con. Excepto que este fue el método que se define, más bien el método abstracto único que se define en la interfaz fúngica del consumidor en porque lo hemos escrito con el tipo de cadena que puedes ver arriba Tenemos consumidor de cadena por tiempos de el tipo de cadena. Tenemos que pasar una cuerda ahora, Así que sólo digamos par, por ejemplo. Y si corremos eso que se puede ver dice sin embargo mi fruta favorita es par, pero de un tipo otro. Éramos mis favoritos de su dolor. De acuerdo, esa es la interfaz del consumidor consumidor. Se necesita un parámetro de entrada agradable y sencillo de implementar en una
interfaz de función muy común que usará como pudiéramos.
23. Codificación con la interposición funcional del proveedor: Ahora veamos cómo podemos usar un suministro, una interfaz funcional y cómo podemos usar eso con una expresión Lambda. Por lo que lo recordaremos con un abasto. Una interfaz funcional emite para devolver valores por lo que no acepta una entrada. Pero en cambio regresa a la salida en su lugar. Por lo que acaban de llamar a un rápido proveedor de entrevista. Por ejemplo, proveedor. Yo soy insurgente. La respuesta para tirar del proveedor de interfaz de función es igual. Ahora aquí. No toma nada como parámetros de entrada. Por lo tanto, tenemos que tener los paréntesis vacíos que hemos visto antes, y ahora sólo podemos devolver algo. Entonces debido a que no tenemos múltiples declaraciones dentro de la Lambda, basta con simplemente poner una expresión aquí. En otras palabras, no
necesitamos la palabra clave de retorno. No obstante, si teníamos múltiples declaraciones ahí dentro, esto, por ejemplo, así que ven aquí para notar declaración para hacer una declaración dentro de las llaves, es
necesario poner un retorno ahí dentro. Por supuesto, ahora es genial por la razón que son grandes horas porque idea inteligente estás sugiriendo que realmente simplificas esto y lo haces mejor reemplazando todo este bloque de
derivación aquí con una expresión en otras palabras ir volver a como estábamos antes, Ver si yo nos, Control dijo. Ahí vamos. Entonces ahora si invoco a este proveedor, no lo consiga volverá. Colocamos por aquí, veremos que devuelve un entero para que pueda imprimir eso solo para que podamos ver que algo en la consola vuelva a correr y luego veremos. El valor devuelto es igual a 42. Eso es consumidor y proveedor, ese tipo de opuestos entre sí. Si te gusta un sexo y en pop uno devuelve una salida. Pero claro, no
tenemos sólo esos tipos de métodos. Indicaciones en realidad tenemos funciones adecuadas en una función, básicamente, es algo que toma algo de entrada y devuelve algo de salida. Echemos un vistazo a la interfaz de función siguiente, que veremos en el siguiente video.
24. 24 codificación con la interposición funcional con la función: Por lo que ahora hemos echado un vistazo a la interfaz de función de consumidor y proveedor es el siguiente
paso lógico es mirar la interfaz de función en. Esto en realidad combina tomar una entrada en devolver una salida hasta que ven eso ahora. Entonces de vuelta en la idea, creamos una función, tenemos una cadena y un entero, y esto va a tomar una cadena. Veamos el nombre de una persona si le damos un pequeño consejo aquí. Si mantienes pulsado, comando o control si estás en un comando Máquina de Windows. Si tu Mac al pasar el ratón sobre el nombre de la variable, verás que es Tony, tipo
eventual de su inferido. Apenas inferimos aquí fuerza. Entonces siempre que veas una interfaz funcional de función, el primer argumento siempre es el tipo de entrada encendido. El 2do 1 es el tipo de salida, por lo que ahora tenemos que devolver algún entero. Vamos a mezclarlo un poco en Vamos a invertir estos en su lugar. Entonces decimos entero y string. Digamos que estamos de paso en la edad de alguien. Entonces ahora podemos ver cuando pasamos el rato, estamos esperando un entero, así que cuando alguien pase en la edad, vamos a tener una expresión aquí. La edad es mayor a 21. Eso es para que puedas conducir. Si es menor de 21 digamos otra cosa. Entonces supongamos que esto es algún tipo de ley en un estado particular en América donde solo si tienes más de 21 eso debería ser el ricotta para cualquiera. Entonces puedes conducir. De lo contrario no se te permite conducir. Entonces si quisiéramos imprimir lo que el resultado es juego, solo
podríamos hacer desde sobre la función de línea de impresión y aplicarlo presionando, por ejemplo, 17 y lo pasamos en 17. Esperamos ver el mensaje. Parece que estás caminando un momento Pase en 32 esperará ver puedes conducir, ver si corro ahora. Sí, parece que estás caminando y puedes conducir. Entonces esa es la interfaz de función encendida. Como puedes ver, es bastante fácil de codificar. Simplemente hay que recordar el orden fuera de los parámetros de tipo en la
propia interfaz de función . 1er 1 es la entrada a la función en el 2do 1 es la salida de la función, pero agradable y simple como hemos visto
25. Codificación con la interposición funcional con la predicación: por lo que los consumidores, proveedores e incluso funciones. Pero ahora estamos consiguiendo una buena comprensión de cómo funcionan estas interfaces de función en la siguiente vamos a ver cuál será la demostración ahora es el predicado. Por lo que bastante corte interfaz de función es algo que toma una expresión y devuelve un valor
booleano basado en mi expresión. Entonces veamos esto en acción. Ahora eso es un apagado crítico. Hagamos esto un poco más interesante. Hagámoslo un depredador de una clase. Entonces si solo crea una nueva clase aquí persona, um, persona tiene nombre en una edad, digamos que es una persona pratica off. No siempre tenemos que pasar en los tipos J T K. Podemos pasar en tercero por tipos o nuestro sobre tipos también. Entonces aquí estamos de paso en persona. Entonces lo que va a pasar aquí es lo que está haciendo. Esta va a ser una forma de decidir si algo es cierto o falso sobre la persona. Entonces, por ejemplo, podríamos tener una pedicura que es vieja o partícula, que es joven, por ejemplo, o su adolescente o lo que sea. Y también para este ejemplo, queremos limitar la copa de crédito lo nombrará. Algo más descriptivo. Entonces ella fue el ejemplo. ¿ Está bien la edad de jubilación en esto va a tomar a una persona tan persona, y vamos a decir persona dedo del pie edad más grande que igual a, digamos 65. Comienza, mantén pulsado el comando y mira los parámetros de entrada. Y Lambda. Se puede ver que es de nuestro tipo de persona de clase estática y se puede ver en el cuerpo de la maderera aquí lo que ella accediendo a un campo fuera de ese tipo de persona. Entonces lo que esto está diciendo es si persona esa edad es mayor o igual a 65 Si eso es cierto , entonces el resultado de invocar esto será cierto. Si es falso, esto será falso. Podríamos crear un tipo diferente de tarjeta de crédito frente al directorio telefónico. Por lo que conseguimos un directorio telefónico de nombres y números de personas, por ejemplo. Y para este particular, no
estaríamos mirando a la edad. En realidad estarán mirando el nombre. Entonces tal vez para este se quiera decir persona no nombre sub string 0 a 1. Entonces la primera letra dos del caso
es igual a Por ejemplo, son todas las personas cuyos nombres comienzan con un Voy a ser el frente del directorio telefónico . El nombre de la ciudad es Adam, por ejemplo, estarás al frente del directorio telefónico. Y si tu nombre es Zoe con eso dicho, pusiste la parte trasera de la rectoría en el primer caso, volvería. Es cierto en el segundo caso
, devolverá falso. Sólo probemos eso. Entonces aquí sólo poner rápidamente en un constructivo para esto sólo para que podamos asignar las variables fácilmente salen aquí. Así está frente a la prueba de directorio divertido, esa persona totalmente nueva cuyo nombre es Adam. Tiene 25 años sin probar Zoe, que también tiene 25. Y deberíamos ver un caso de Adán. Será cierto on, En el caso de Zoey, será falso. No eran verdaderas y falsas. Eso también es prueba Zoe para ver, sobre todo un Vamos a armar estos. De hecho, se está haciendo un poco más claro, más el así vamos a ver. Siempre es una edad de jubilación. ¿ Está retirado Ari? A ver ¿Bernard está retirado? Amber va a ser una persona nueva, y tiene 67 años para que cuando corremos, esto es un jubilado sea falso. En su Bernard, retirado es cierto por lo que se puede ver que podemos usar no sólo la interfaz de función de predicado, sino de hecho, cualquier interfaz de función con otros tipos. Entonces, ya sea los tipos de cuidado JD estándar o los tipos rápidos que espejan primitivas que lo
tenemos en doble flotación de cosas, nuestros propios tipos desde los nuestros desde la demanda de nuestras propias aplicaciones. Esto se debe a que existen estas interfaces de funciones genéricas las cuales están presentes en Java, que le dijiste a esa función. Entonces, de todos modos, esa fue una demostración sobre cómo usar la interfaz de la función de predicado. Y así, estas
alturas, deberías estar en una posición en la que podamos empezar a explorar la interfaz focal FBI y las diferentes clases dentro de ella para poder proporcionar los tipos de objetivo adecuados para tus
expresiones de prestamista .
26. 26 codificar una colección de clases de dominio para el procesamiento de la transmisión de la transmisión: en esta sección, vamos a ver los ductos y streams y ver cómo podemos procesar las colecciones utilizando el nuevo trabajo. Ocho Stream, FBI Para que hagamos esto, necesitamos tener algunos datos con los que realmente podamos trabajar. Entonces en este video, vamos a cortar algunas clases de dominio simples que podemos lanzar en una colección para que podamos procesarlas usando el FBI de Stream en el siguiente video. Entonces hagámoslo ahora. Entonces, en primer lugar,
vamos a crear una clase de colección, que contiene algunos datos que podrían ser un poco interesantes para los fines de esta demo. Entonces esa es la clase. Contar con un estudiante con un porcentaje redondeado. El alumno tiene nombre. Digamos que pertenecen a una clase en particular en esa clase los está preparando para un examen
en particular. Entonces solo diremos que ahora es una referencia a examen. También está creando clase de examen, y estos algunos enfrentamientos tienen nombre, y eso es suficiente por ahora. Vamos a darle un constructor en. Consigamos este un constricto a Así que conseguí un modelo de demanda muy sencillo con el que podemos trabajar. Tenemos un estudiante que tiene un nombre en particular estudiando para un examen en particular y restaurando los resultados porcentuales redondeados. Es decir, un número entre cero y 100 por lo que consiguieron en ese examen. Hay otras formas de modelar esto, por
supuesto, y ciertamente no tendríamos estas clases extáticas. Pero el propósito de este Demmer, está bien. Acabamos de tener un par de clases estáticas aquí con las que podemos trabajar. Entonces si llegamos al método de los hombres, supongamos que nos devuelven una lista de algún A p I, que es al menos, Pero su lista de estudiantes ¿lo estás pensando ahora? En verdad son resultados estudiantiles, ¿no? Entonces, basta con bajar aquí, lo que ha modificado este levemente cambio hacia arriba. Seis resultados de exámenes de estudiantes universitarios solo llamaron a estos resultados para hacerlo un poco más sencillo. Vale, lingüista, Solo imagina este regreso de asi mi p I Ahora estamos usando una lista aquí con los resultados reales que se ordena o no, realmente no
nos importa. vamos a poner en cualquier orden así que semánticamente es un conjunto. Pero estamos usando esta lágrima porque, por ejemplo, cuando interactuamos con Jenny BC, solemos recuperar una lista, y la razón de eso es porque la lista viene en 10 y ordena si los resultados que vienen back sucede tener en orden. Por ejemplo, si tuviste una declaración de secuela que tienen una orden de todos modos, pongamos aquí algunos estudiantes. Resultados que entregan resultados de exámenes de Houston. Este obtuvo 56. Ahora tenemos que aprobar un examen también. Entonces, sólo vamos aquí arriba. Solo creemos un par de exámenes. Es una buena práctica, en realidad, solo comentar esto mientras hacemos eso. Por lo que exámenes se certificación Java. A ver a Nathan 101 Eso probablemente no es por ahora, Lo que sea. Sea lo que sea
que sea, está bien. Entonces, ¿llegaste a exámenes? Examen de certificación laboral en el Navan 101 Así que ahora podemos volver a aquí y decir desde el cielo 101 Obtuvo 56 No lo hizo tan bien. Día, pero ¿72 en la certificación Java? No, sólo
vamos a dar una mezcla de algunos otros también. Algunos de los estudiantes. Entonces digamos sólo en un proyecto de ley. También obtuve el mismo resultado en acidificación laboral. La coincidencia que Gareth cambiará aquí, también, Michael 12. O tal vez fue uno. Pero en su trabajo, una certificación que obtuvo 88 arrojará otra también. ¿ Por qué no uno de los esenciales Apache? Sigue siendo éste. Por lo que tenemos un conjunto razonable de datos con los que podemos trabajar. Sólo pongamos una cuerda de dos en estos que podemos ver qué está pasando si imprimimos la montaña a cuerda. Eso está bien en una cuerda de dos en el examen también, solo para mantener las cosas ordenadas para que podamos ver qué está pasando. Extraigamos esto. Re Fekter extracto a otro método. Obtén resultados estudiantiles. Andi, si pasamos por aquí, simplemente lo hacen regresar Los resultados de la lista es que
evitan y luego regresan? Esos resultados lo significan. Ahora tienen esto todos los resultados estudiantiles. Simplemente llámalo resultados. Probablemente mantenerlo simple. Vamos a imprimirlos Así sabemos con qué estamos trabajando y ejecutar este método de hombre ahí . Podemos ver en la parte inferior tenemos algunos datos con los que realmente podemos trabajar. Y si pongo un punto de ruptura aquí y solo lo depuro en su lugar, podría ser más agradable mirar en la vista de depuración que podemos ver aquí. Tenemos los resultados. Objeto lingüista con seis dentro en aquí, tenemos todos los resultados que estaban trabajando con Ok. No obstante, si estamos poniendo estos objetos de demanda dentro de colecciones en, si quieres probar alguna igualdad, ese tipo de cosas las comparan entre sí. Entonces deberíamos implementar igual y código hash también. Entonces sólo tienes que ir a aquí igual y código hash. Siguiente. A continuación, hagamos lo mismo a sí, no
va a ser igual en código hash, lo que significa que estos demandan objeción. Ahora se supone que los comportamientos deben comportarse porque esperamos dentro de las clases de cobranza. OK, entonces ahora tenemos estos objetos de demanda contados y colocados en una colección. Ellos ven cómo podemos procesarlos con los arroyos. FBI, lo que hará en el próximo video
27. 27 codificación con la API de Streams para procesar una colección compleja: Por lo que vimos en el último video que construimos una colección de algunos simples objetos de demanda. Entonces en este video, veamos cómo puede procesar esa colección usando los streams FBI. Entonces pensemos en lo que nos gustaría hacer con estos resultados. No quiero enterarme de toda la gente que consiguió más del 70% porque pueden
pasar al siguiente curso. Entonces para hacer que los resultados es una lista sobre el flujo de meta menos debilitado se podría ver aquí
recuperamos una corriente de examen estudiantil YSL, lo que significa que ahora si miramos dentro de stream, devuelve este comando de método de flujo de 12. En este punto, tenemos todos estos métodos a los que podemos llamar para procesar el streaming en algún lugar todo mucho cualquier conteo de partidos distinto. Encuentra cualquier multa primero para cada mapa, ese tipo de cosas. Entonces si queremos que los alumnos que consiguieron más del 70% entonces ya lo que hacer es filtrar y vamos a pasar en un predicado sobre el predicado verás necesidades de tomar un tipo de resultados de exámenes
estudiantiles o una de sus sub clases. No tenemos ningún excedente. Está aquí tan pronto examen. Va a estar bien. Y el predicado va a devolver un booleano. Alguien va al método del filtro sólo que estamos en la misma página. Podemos verlo cuando filtramos. Está tomando en esta bonita copa en el proyecto tiene esta función aquí prueba la cual toma un solo parámetro, y él puede evaluar lo que quieras evaluar sobre ese parámetro. Por lo que estará evaluando el porcentaje redondeado dentro de un examen estudiantil. Resultado en él devuelve un 1,000.000.000 el cual va a ser verdadero o falso. Entonces vamos a corregir el predicado para esto. Vamos a ser el mismo resultado. Y ahora cuando tenemos este resultado, podemos acceder a los métodos son propiedades, ¿no? Entonces dirá alrededor de él porcentaje y vamos a filtrar donde el porcentaje redondeado es mayor o igual a 70. Entonces vamos a filtrar de nuevo, manteniendo pulsado el comando, pasando el puntero sobre el método del filtro. Aquí podemos ver el arroyo encadenado en acción. Por lo que hemos llamado a Filtro, que no es operación intermedia on debido a esto es volver de corriente de la razón de eso como hemos visto ante ustedes para que podamos seguir adelante y podamos seguir haciendo otro procesamiento si es necesario. Entonces, solo hagamos eso. Encontremos los nombres de las personas que superan los 70. Entonces para hacer esto podemos hacer un mapa de puntos, que es otra operación intermedia en Ahora. Cuando lo hagamos, un mapa verá su función de aceptación, que acepta el examen estudiantil, Russell y algunos del tipo este signo de interrogación extiende nuestro en sus noches haciendo capturando eso porque va a dar vuelta entonces un arroyo de nuestro Entonces, por
ejemplo, si devolvemos el nombre de que va a ser una cadena para que devuelva una corriente de cadena, y a partir de entonces solo se puede acceder a cualquier cosa aplicable a una generosa de flujo al
tipo de cadena , como veremos. Entonces esto podría parecer algo complejo ahora. Creo que se estaba volviendo un poco complejo dentro del método del mapa. Tenemos esta función signo de interrogación Súper examen de estudiante. Pregunta Russell. Mark extiende Nuestra corriente son, pero no olvides que es solo una interfaz funcional en la interfaz de funciones. No te fastidie en absoluto. Es todo lo que tienes que hacer es personal bajo expresión, que coincide con esa interfaz funcional. Entonces para descomponerlo una función que dijimos u otra interfaz de función función tiene dos parámetros a eso. El primero es el parámetro de entrada. Eso es lo que estamos pasando a la función a la expresión maderera en este caso y a los segundos parámetros. Lo que estamos pasando de esa función de esa expresión landler por lo que tenemos que hacer ahora es pasar en este mapa una función en el mapa, una función que verás aquí, Función, función, interfaz. Se recuerda que la función tiene dos argumentos a la misma. El primero es la entrada a la función, que en este caso es un estudiante examina todo en el segundo argumento es el resultado de esa función. Entonces la salida de la función Esto significa que podemos escribir una expresión prestamista como esta. Eso es un aumento de resultados. Y vamos a devolver los rayos no nombre. Obviamente, aquí estoy accediendo a campo directamente. Es una clase demo puede acceder a los campos en lo estático en las clases, pero de manera similar está bien, también
puedes ir por el método real en su lugar. Entonces, por ejemplo, si resulta que agrego,
trae a alguien aquí por el nombre. Pero también podría no conseguir nombre así en este punto se está poniendo un poco difícil de manejar. Es una gran, larga fila. Entonces lo que me gustaba hacer sus resultados encabezó arroyo sobre la incredulidad allí, la
mitad de las invocaciones individuales contra el objeto stream. Entonces no te sientas demasiado aquí. No mapees aquí y ahora vamos a usar un coleccionista. Vamos a usar el 2do 1 que sabe armar esto en un set. Es una señal de que evaluar también. Entonces ahora estamos y tenemos un conjunto de cuerdas. Pam podrá imprimir eso. Hagamos por cada uno, que ahora toma un consumidor consuma, recordarás solo para funcionar, que toma un parámetro, y podemos usar el sistema fuera de línea de frente como referencia de método. Entonces si ejecutamos eso ahora, es bastante código. Aprecio eso. Me alegra que lleves con nosotros para poder superarlo. Si me atropellaron, se podía
ver a los mejores estudiantes son Gareth y Annabelle. Mi última cosa también. Hablar de referencias de métodos es que ahora podemos ir hasta aquí en adelante. Esta es una expresión londinense, pero no puedo reemplazar esto por un método de referencia ahora a los resultados del examen estudiantil. Entonces aquí vamos. Resultado de examen estudiantil. Colon común consiguiéndolos y corremos y tenemos el mismo efecto. Por fin soy lo que podemos hacer, aunque sólo sea para ordenar que, um, sólo
podemos hacer asaltados aquí en. Entonces ordenados, verás los precios de nuevo aguas arriba de nuevo porque es una operación intermedia, por lo que no es una Terminal uno. Entonces aún necesitamos tener esta colecta. Pero esta vez, en lugar de ser coleccionistas para establecer qué ideas inteligentes ponen automáticamente para nosotros. Y luego está diciendo por qué usar ordenadas Porque está configurado no depende del agua salada . Entonces no tiene sentido lo cual es cierto pero idea inteligente en pelea natural salta el arma ahí . Si ponemos una lista ahí en su lugar, que sí respeta orden, entonces sólo podríamos hacer para enumerar y ahora deberíamos encontrar Los mejores alumnos están listados en orden
alfabético. Entonces, en otras palabras, Annabelle debería venir ante Gareth, lo cual es cierto. Dicho esto, el Gareth llegó a la cima en algunas de las cosas que realmente tienes algunas repeticiones de Gareth ahora que tal vez no queremos que suceda así que también podemos enchufar otra aquí , que es el punto distinto en esto recortará cualquier duplicado. Entonces ahora controlamos nuestros puedes ver que los mejores estudiantes son animales y Gareth, así que esa es una buena introducción a cómo puedes usar ductos y arroyos. No lo olvides. Siempre que use este tipo de cosas, consulte el doc de Java. No tengas miedo de hacer clic en los métodos individuales de flujo
las operaciones intermedias o terminales y también utilizar Intel, Ajay o eclipses tipo sobre recomendaciones de reflexión para poder averiguar qué hacer y se pone un bonito, limpio, conciso, códigolimpio,
conciso,
funcional. Y así es como procesas las colecciones eran. Aparecen los arroyos.
28. Cola con referencias de los métrico Bound y Unbound de la Instance inatas. y desatadas: Entonces en estos próximos videos vamos a pasar y echar un vistazo a las referencias de métodos con más detalle
en Comparar los diferentes tipos, que tenemos en el primer tipo de referencias de métodos que vamos a ver nuestra instancia . Referencias de métodos. Entonces, empecemos mirando la referencia del método al que llegamos cuando buscamos volver a factorizar una expresión lander en su referencia de método correspondiente. Pensemos en qué tipo de método de referencia es éste por un segundo. Te acuerdas. Tenemos diferentes tipos de referencias de métodos estáticos, enlazados y desvinculados. Instancia, referencias de
método y construido por las referencias pensando en qué tipo es. Vamos a romperlo aquí abajo. Entonces un sistema que fuera, si sólo vamos a escuchar, los
veremos fuera sistemas. Lo que realmente representa es un flujo de impresión estático en la clase del sistema porque lo que realmente
es, es un flujo de impresión en las misiones del sistema. No obstante, si hacemos clic en la línea de impresión, esto no es estático, por lo que en realidad es un método de instancia en su método de instancia en la propia corriente de impresión . Se puede ver aquí imprimir stream, así que cierra esos dos otra vez así Esto es como lo mismo si tuviéramos solo una variable aquí, que se vincularía en el método de instancia, también, en forma de una referencia de método. Entonces esto no representa la invocación del método estático, sino que en realidad representa una instancia. Invocación de método. No obstante, debido a que en realidad estamos pasando la instancia real, se invocará contra cuál es esta referencia de flujo de impresión por fuera en la clase del sistema . Esto está ahí para abundar. Referencia del método de instancia porque estamos vinculando la instancia contra la que queremos que se
invoque el método dentro de la referencia del método en sí. Entonces no te confundas ni te dejes engañar por el hecho de que lo que pasa es una variable estática en la clase del sistema que podría parecer un poco confusa. Simplemente ignora eso. Pretende que no está ahí. Obviamente es lo contrario no compilará lo que Pretende que no está ahí y solo
enfocarse en esta parte para determinar el tipo real fuera de la referencia del método. Entonces es abundante, referencia de método de
instancia, Es por ello
que, cuando lo ejecutamos, ya tiene un sueño de impresiones adecuado al que ir, que es lo que puede imprimir la cadena que pasamos cuando invocamos la excepción método. Ahora esa es una instancia encuadernada. Referencia del método. Como dijimos, está en Prince Stream. Por lo que aquí otra vez, haga clic fuera. Vemos que es un arroyo de impresión. Nunca hago clic. Interpretado Comando Stream de 12. Podemos ver que tenemos estos métodos de línea de impresión en Estos no son estáticos. Aquí no hay s. Estos son solo métodos de instancia en el objeto de flujo de impresión. Entonces cancela ambos. Entonces, ¿qué? Podríamos hacerlas. Su referencia a imprimir stream directamente. Colin Colin Línea de impresión. Ahora, a pesar de que esto parece que de alguna manera estamos invocando la línea de impresión, estáticamente eran no, solo nos
está permitiendo seleccionar un método de instancia
en realidad, cualquier método, cualquier método,de hecho, de una clase en particular. Por lo que esto es sólo decir Seleccione la línea de impresión Método de la Clase Príncipe Sueño. Ahora el compilador sabe internamente que ese no es un método estático. Es una instancia. Método sobre idea inteligente sabe que es un oleaje. Entonces si saltamos al frente de esto, veremos que
tenemos esta pequeña ayudarla, lo
que nos permitiría convertirla en una declaración adecuada o,
por cierto, es lo que La razón por la que esto es, listo diciendo que es no una declaración porque no le hemos asignado espacio. Pero no podemos tener expresiones Lambda, que apenas está ahí fuera, no ser asignadas o pasadas a nada regresen de nada y simplemente también. aplican exactamente las mismas reglas a las referencias de métodos, simplemente no una declaración de la minuta. Pero siempre se puede hacer, aunque esa cosa de signo de exclamación se vaya es su último enter. Y luego obtienes estos llamados arreglos rápidos, que puedes emplear. Entonces es interesante ahora mirar lo que sucede cuando queremos introducir una variable local . Por lo que esta es una pequeña solución rápida de inteligente nos dará poder asignar ese método referencia a una variable del tipo correspondiente. Y esto en realidad es un buen consejo de poder para ti que si alguna vez no estás seguro de cuál podría ser el tipo, podrías simplemente ir a esta solución rápida en tu seleccionado, y viene con unas cuantas interfaces funcionales compatibles, que coincidió con la función. Descriptor fuera de ese método
de referencia, siendo el primero más uno el preferible, el que es más compatible en este caso. Es un por consumidor, por lo que está sugiriendo una corriente de impresión y una matriz de caracteres. Si hacemos click en línea de impresión, copia eso. 12. Deja que veas el riff Tú aquí para que veas que hay una línea de impresión que no lleva nada. Están poniendo líneas que llevan varias primitivas diversas sobre la que somos uno . Aquí hay una línea de impresión, que toma la cuerda. Ese es el que ya hemos usado, así que nos apegaremos a eso. Se pegará a imprimir línea de cuerda. A ver si me escapa de ese Kimanzi para recuperarlo. No ir por el camino equivocado Eso es mejor así que podría simplemente bajar aquí ahora retomar Los
rakers de Ciara no tienen intención de pasar en un char Ray en su lugar puede poner cuerda y darle puede ser un mejor nombre. Función Rita a Isabella. A lo menos lo separa del original. Ahora pues, esto es interesante. Por lo que por el consumidor. Entonces, ¿qué les hace eso? Bueno, igual que un consumidor garrapata a uno en un argumento pobre excepto un solo argumento del consumidor, probablemente adivinaste, puede aceptar a los argumentos. Y la razón por la que necesitamos hacerlo excepto a argumentos, es porque el primer argumento es en realidad el Prince Stream. Lo vamos a invocar en contra. Y la razón por la que necesitamos pasar el Prince Stream es porque cuando hemos construido aquí este método de referencia, no
hemos dicho en qué instancia va a ir en contra. Y así, por tanto, el tipo de referencia de este método de instancia en este caso no está vinculado. Referencia del método de instancia como el botón anterior instancia unbound. Referencia del método. Entonces esto significa que cuando llamamos saluda una función a, excepto que ahora tenemos dos argumentos. Ya verás donde necesitamos abastecer como primer argumento. El príncipe sueña que se invocará en contra estoy buscando sistema de referencia justo a cabo es
que es público y es estático, por lo que es accesible para nosotros. Está disponible fuera de la clase del sistema en otra cadena. Voy a enlazar referencia de método de instancia en este solo para que quede claro, ya
sabes, desde abundantes, referencia de
método y que sí controlamos nuestro para correr. Podemos ver que está involucrado correctamente. Dice que soy una referencia de método de instancia no vinculada. Entonces eso fue todo. Agradable y fácil. Como puede ver, la diferencia entre las referencias de métodos enlazados y no consolidados no es tan difícil de
entender . Una vez que te acabas de dar cuenta de que la referencia del método enlazado toma un parámetro implícito, que es la instancia en la que se invoca de todos modos, por lo que eso debería darte una buena comprensión de las referencias del método de instancia, que ahora puedes usar en su trabajo. Ocho. Corte.
29. 29 codificación con referencias de métodos estáticos: Entonces ahora estamos familiarizados con las referencias de métodos de instancia, que hemos visto en el último video. Pongamos nuestra atención a sus referencias de métodos estáticos. Entonces para crear una referencia de método estático, pensemos en algunos métodos estáticos, que probablemente nos sean bastante familiares. Subproceso amenaza de corriente oscura. De acuerdo, entonces eso devuelve básicamente el hilo actual en operación. Entonces este es un método estático en la clase de hilo, y así deberíamos poder construir una referencia de método estático fuera de él, y podemos hacerlo simplemente reemplazando punto por una columna doble eliminando paréntesis de tema. Pero de nuevo, no
es una declaración. Ya veremos. Por lo que necesitamos asignar. Fue antes de dar a un consumidor que aceptaba uno o más parámetros. El interfaz de funciones correspondiente para esto es un proveedor que va a devolver un valor en lugar de aceptar valores. Por lo que es un proveedor off thread hold respuesta para importar eso. Ahora sabemos que es un proveedor de hilo porque si comandamos y pasamos el cursor sobre este método por
lo que se convirtió en un hipervínculo, podemos ver aquí la información rápida. Está diciendo que la amenaza actual devuelve un objeto de hilo, y de nuevo podría invocarlo para que nosotros mazel imprimimos para que podamos ver cuál es el valor. Entonces dice fuera línea de impresión, Fred función no consigue y nos deben dar rápido Estamos para acceder ¿Qué? El control actual de Freddie yo ahora debo decir el hilo de los hombres que se puede ver aquí
nos ha dado una referencia a la principal amenaza. Entonces eso es una estática Met the reference. Basta con poner estos solo para que sea algo explícito lo que estamos haciendo aquí. Esta era la referencia del método de instancia enlazada. Estos desequilibrios waas cumplieron con la referencia, empezando por la referencia. Entonces explosión que vamos a tener es una referencia de método constrictor y vamos a ver construirlo en las referencias en acción en el siguiente video.
30. 30 codificación con referencias de métodos de los constructores del constructor: en este video, vamos a ver referencias constructivas de métodos, Así que vamos a retomar de donde lo dejamos antes. Pero estamos buscando referencias extáticas. Entonces para construir referencias de métodos de nuevo, este es un proveedor porque estamos devolviendo una instancia de la clase y devolviendo un nuevo objeto. Por lo que realmente es una forma de salir de su declaración de un método de fábrica. Si te gusta fabricar instancias de la clase y para esto, solo
tenemos que dar una referencia a la nueva clave lo haría después de la doble calma. Y al hacer eso, el constructor predeterminado real, o más bien que ningún constructor de argumentos podría ser encapsulado en esa referencia de método. Entonces, por ejemplo, podríamos tener un proveedor, Calenda, y lo vi que construyen sobre la referencia para crear un nuevo calendario gregoriano. Entonces, cuando soy folk lo que puedes ver aquí, es el retorno el calendario gregoriano en cuanto a su super tipo de calendario. Ese es el tipo de interfaz calendario de grabación se extiende. Entonces lo hago para llegar, cuenta. No, Si corro Si imprimí también. No. Si corro, puedes ver aquí. Tenemos de vuelta una instancia de un calendario coreano, Así que fíjate aquí también. Y esta es la razón por la que elegimos este ejemplo que cuando estás usando la
referencia del método , también
podemos asignarlo a una interfaz de funciones de un tipo compatible sobre la compatibilidad. Aquí está el hecho de que el calendario gregoriano extiende calendario, por lo que si miramos dentro del calendario gregoriano, podemos verlo extiende calendario aquí, por lo que debería ser una buena introducción a las referencias de métodos, y deberías ser capaz de utilizarlos en sus propias aplicaciones ahora.
31. 31 bien hecho y agradecimiento y gracias: Bueno, ese es el final del curso sobre solo quiero decir qué tan bien los usaron para llegar hasta el final . Hay muchos conceptos difíciles en Javari,
como has visto, como has visto, pero a través de la perseverancia y el trabajo duro tienes ahí al final, Bien hecho. Eso es realmente grandioso cuando deberías estar orgulloso, ya
sabes, en posición de poder llevarlo más allá y profundizar más con el conocimiento que tienes . Así que diviértete haciendo eso. Y no lo olvides, siempre
puedes llegar a mí desde cualquier pregunta. Todo lo que queda ensayos. Diviértete con todo. Disfruta aplicando un conocimiento recién encontrado y ten un gran día por delante.