Présentation des expressions Lambda, le sucre syntaxique de Java 8
Feb 18, 2021 pm 06:09 PMRecommandations d'apprentissage gratuites?: Tutoriel de base Java
Introduction aux expressions Lambda
.L'expression Lambda est une nouvelle fonctionnalité de Java8 et l'une des nouvelles fonctionnalités les plus intéressantes à apprendre de Java8. (Une autre nouvelle fonctionnalité est la programmation en streaming.) Une expression Lambda est essentiellement un
. Vous pouvez utiliser cette méthode anonyme,
匿名方法
Fonction?: Les expressions lambda sont généralement utilisées pour實(shí)現(xiàn)接口中的方法
. Il existe de nombreuses fa?ons d'implémenter des interfaces, telles que : ① Concevoir la classe d'implémentation de l'interface, ② Utiliser des classes internes anonymes. Mais ③ utiliser l'expression lambda est plus simple que ces deux méthodes.Exigences?: expression lambda,
簡(jiǎn)化接口實(shí)現(xiàn)
?: Autrement dit, dans une interface, il n'y a qu'une seule méthode abstraite que la classe d'implémentation doit implémenter.-
est utilisé avant une interface pour déterminer si l'interface est une interface fonctionnelle. S'il ne s'agit pas d'une interface fonctionnelle, une erreur sera signalée. La fonctionnalité est similaire à @Override.只能實(shí)現(xiàn)函數(shù)式接口
2. Syntaxe de l'expression lambda
@FunctionalInterface注解
Une expression lambda est essentiellement une méthode anonyme, donc lors de l'écriture d'une expression lambda, vous n'en avez pas besoin. Peu importe le nom de la méthode et vous n'avez pas besoin de vous soucier du type de valeur de retour. Il n'y a que deux parties dont il faut se soucier?: , .
{}Partie du corps de la méthode?: la partie implémentation de la méthode. Si la méthode définie dans l'interface a une valeur de retour, faites attention à la valeur de retour lors de son implémentation.
參數(shù)列表
() Partie paramètre?: La liste des paramètres de la méthode doit être cohérente avec la partie paramètre de la méthode dans l'interface implémentée, y compris le nombre et le type de paramètres.方法體
- -> : Sépare la partie paramètre et la partie corps de la méthode.
Lambda表達(dá)式基礎(chǔ)語(yǔ)法:(參數(shù))?->{ 方法體}
Ce qui suit est l'implémentation de l'expression lambda pour les six interfaces fonctionnelles ci-dessus.
函數(shù)式接口
/** ?*?@Description: ?*?@author?Guoqianliang ?*?@date?19:50?-?2021/2/15 ?*/public?class?BasicSyntax?{ ????public?static?void?main(String[]?args)?{ ????????//?1.實(shí)現(xiàn)無(wú)參數(shù),無(wú)返回值的函數(shù)式接口 ????????NoneReturnNoneParameter?lambda1?=?()?->?{ ????????????System.out.println("這是無(wú)參,無(wú)返回值的方法"); ????????}; ????????lambda1.test(); ????????//?2.實(shí)現(xiàn)一個(gè)參數(shù),無(wú)返回值的函數(shù)式接口 ????????NoneReturnSingleParameter?lambda2?=?(int?a)?->?{ ????????????System.out.println("這是一個(gè)參數(shù),無(wú)返回值的方法,參數(shù)a:"?+?a); ????????}; ????????lambda2.test(10); ????????//?3.實(shí)現(xiàn)多個(gè)參數(shù),無(wú)返回值的函數(shù)式接口 ????????NoneReturnMutipleParameter?lambda3?=?(int?a,?int?b)?->?{ ????????????System.out.println("這是多個(gè)參數(shù),無(wú)返回值的方法,參數(shù)a="?+?a?+?",b="?+?b); ????????}; ????????lambda3.test(10,?20); ????????//?4.實(shí)現(xiàn)無(wú)參數(shù),有返回值有返回值的函數(shù)式接口 ????????SingleReturnNoneParameter?lambda4?=?()?->?{ ????????????System.out.println("這是無(wú)參數(shù),有返回值的方法,返回值是:"); ????????????return?10; ????????}; ????????System.out.println(lambda4.test()); ????????//?5.實(shí)現(xiàn)一個(gè)參數(shù),有返回值的函數(shù)式接口 ????????SingleReturnSingleParameter?lambda5?=?(int?a)?->?{ ????????????System.out.println("這是一個(gè)參數(shù),有返回值的方法,返回值是:"); ????????????return?a; ????????}; ????????System.out.println(lambda5.test(10)); ????????//?6.實(shí)現(xiàn)多個(gè)參數(shù),有返回值的函數(shù)式接口 ????????SingleReturnMutipleParameter?lambda6?=?(int?a,?int?b)?->?{ ????????????System.out.println("這是多個(gè)參數(shù),有返回值的方法,返回值是:"); ????????????return?a?+?b; ????????}; ????????System.out.println(lambda6.test(1,?2)); ????}}Simplification avancée de la syntaxe?:
Le type de paramètre de la liste de paramètres peut être omis.
S'il y a un et un seul paramètre dans la liste des paramètres, les parenthèses peuvent être omises.
- S'il n'y a qu'une seule instruction dans le corps de la méthode, les accolades peuvent être omises. (Remarque?: si cette instruction est une instruction return, le mot-clé return doit également être omis après avoir omis les accolades)
- Référence de la fonction
Les expressions Lambda visent à simplifier l'interface. Dans les expressions lambda, une logique plus complexe ne devrait pas appara?tre. Si la logique à traiter est relativement complexe, une méthode distincte sera généralement écrite. Référencez simplement cette méthode directement dans l’expression lambda. Autrement dit,
1. Syntaxe de référence de méthode statique
引用一個(gè)已經(jīng)存在的方法,使其代替lambda表達(dá)式完成接口的實(shí)現(xiàn)。
?:
dans la référence Après la méthode, n'ajoutez pas de parenthèses. Les paramètres (numéro, type) et valeur de retour de la méthode référencée par
類(lèi)::靜態(tài)方法
doivent être cohérents avec ceux définis dans l'interface.
/** ?*?@Description:?方法引用 ?*?@author?Guoqianliang ?*?@date?0:26?-?2021/2/16 ?*/public?class?Lambda1?{ ????private?static?interface?Calculate?{ ????????int?calculate(int?a,?int?b); ????} ????private?static?int?calculate(int?x,?int?y)?{ ????????if?(x?>?y)?{ ????????????return?x?-?y; ????????}?else?if?(x?- 2. Référence de méthode non statique
Syntaxe?:
dans référence Après la méthode, n'ajoutez pas de parenthèses. Les paramètres (numéro, type) et valeur de retour de la méthode référencée par
對(duì)象::非靜態(tài)方法
doivent être cohérents avec ceux définis dans l'interface.
/** ?*?@Description:?方法引用 ?*?@author?Guoqianliang ?*?@date?0:26?-?2021/2/16 ?*/public?class?Lambda1?{ ????private?static?interface?Calculate?{ ????????int?calculate(int?a,?int?b); ????} ????//?非靜態(tài)方法 ????private?int?calculate2(int?a,?int?b)?{ ????????if?(a?!=?b)?{ ????????????return?a?-?b; ????????} ????????return?a?+?b; ????} ????public?static?void?main(String[]?args)?{ ????????//?非靜態(tài)方法引用 ????????Calculate?calculate2?=?new?Lambda1()::calculate2; ????????System.out.println(calculate.calculate(10,?20)); ????}}- 3. Référence de la méthode du constructeur
Syntaxe?:
peut être transmise via l'interface Les paramètres de la méthode dans la méthode font référence à différents constructeurs.
類(lèi)名::new
Si une méthode définie dans une interface fonctionnelle sert simplement à obtenir un objet d'une classe. à ce stade, vous pouvez utiliser la référence à la méthode constructeur pour simplifier l’implémentation de cette méthode.
/** ?*?@Description:?構(gòu)造方法引用 ?*?@author?Guoqianliang ?*?@date?11:20?-?2021/2/16 ?*/public?class?Lambda2?{ ????@FunctionalInterface ????private?interface?GetPersonWithNoneParameter?{ ????????Person?get(); ????} ????@FunctionalInterface ????private?interface?GetPersonWithSingleParameter?{ ????????Person?get(String?name); ????} ????@FunctionalInterface ????private?interface?GetPersonWithMutipleParameter?{ ????????Person?get(String?name,?int?age); ????} ????private?static?class?Person?{ ????????String?name; ????????int?age; ????????public?Person()?{ ????????????System.out.println("Person類(lèi)的無(wú)參構(gòu)造方法執(zhí)行了"); ????????} ????????public?Person(String?name)?{ ????????????this.name?=?name; ????????????System.out.println("Person類(lèi)的有參構(gòu)造方法執(zhí)行了"); ????????} ????????public?Person(String?name,?int?age)?{ ????????????this.name?=?name; ????????????this.age?=?age; ????????????System.out.println("Person類(lèi)的兩個(gè)參數(shù)的構(gòu)造方法執(zhí)行了"); ????????} ????} ????public?static?void?main(String[]?args)?{ ????????//?1.使用lambda表達(dá)式,實(shí)現(xiàn)GetPersonWithNoneParameter接口 ????????GetPersonWithNoneParameter?getPerson?=?Person::new; ????????//?2.使用lambda表達(dá)式,實(shí)現(xiàn)GetPersonWithSingleParameter接口 ????????GetPersonWithSingleParameter?getPerson2?=?Person::new; ????????//?3.使用lambda表達(dá)式,實(shí)現(xiàn)GetPersonWithMutipleParameter接口 ????????GetPersonWithMutipleParameter?getPerson3?=?Person::new; ????????System.out.println(getPerson.get()); ????????System.out.println(getPerson2.get("樹(shù)先生")); ????????System.out.println(getPerson3.get("你好",?23)); ????}}- 4. Références spéciales aux méthodes d'objet
Lors de l'utilisation d'expressions lambda pour implémenter certaines interfaces, si dans l'expression lambda contient un objet. Dans le corps de la méthode, utiliser directement cet objet pour appeler l'une de ses méthodes peut compléter la logique globale.
/** ?*?@Description:?對(duì)象方法的特殊應(yīng)用 ?*?@author?Guoqianliang ?*?@date?11:54?-?2021/2/16 ?*/public?class?Lambda3?{ ????@FunctionalInterface ????private?interface?MyInterface?{ ????????//?String?get(Person?person); ????????void?set(Person?person,?String?name); ????} ????private?static?class?Person?{ ????????private?String?name; ????????public?void?setName(String?name)?{ ????????????this.name?=?name; ????????} ????????public?String?getName()?{ ????????????return?name; ????????} ????} ????public?static?void?main(String[]?args)?{ ????????Person?p1?=?new?Person(); ????????p1.setName("小明");//????????邏輯實(shí)現(xiàn)只是為了獲取到對(duì)象的名字//????????MyInterface?lambda2?=?Person::getName;//????????System.out.println(lambda2.get(p1)); ???????? ????????//?邏輯實(shí)現(xiàn)只是為了給對(duì)象的某些屬性進(jìn)行賦值 ????????MyInterface?lambda1?=?(x,?n)?->?x.setName(n); ????????MyInterface?lambda2?=?Person::setName; ????????lambda2.set(p1,?"李華"); ????????System.out.println(p1.getName()); ????}}
4. Problèmes auxquels il faut prêter attention avec les expressions Lambda
Si est utilisé, il sera déclaré comme une constante par défaut, ce qui ne peut pas entra?ner de changements de valeur.
/** ?*?@Description: ?*?@author?Guoqianliang ?*?@date?13:05?-?2021/2/16 ?*/public?class?Lambda4?{ ????public?static?void?main(String[]?args)?{ ????????//?1.定義一個(gè)局部變量 ????????int?x?=?10; ????????//?2.使用lambda表達(dá)式實(shí)現(xiàn)接口 ????????LambdaTest?lambda?=?()?->?{ ????????????System.out.println("x="?+?x); ????????}; ????????//?3.?無(wú)法修改常量x ????????//?x=20; ????}}@FunctionalInterfaceinterface?LambdaTest?{ ????void?test();}
局部變量
Recommandations d'apprentissage associées?:
bases de Java
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

En C++, il existe deux manières de gérer les exceptions à l'aide d'expressions Lambda?: intercepter l'exception à l'aide d'un bloc try-catch et gérer ou renvoyer l'exception dans le bloc catch. à l'aide d'une fonction wrapper de type std::function, sa méthode try_emplace peut intercepter les exceptions dans les expressions Lambda.

En C++, une fermeture est une expression lambda qui peut accéder à des variables externes. Pour créer une fermeture, capturez la variable externe dans l'expression lambda. Les fermetures offrent des avantages tels que la réutilisabilité, la dissimulation des informations et une évaluation paresseuse. Ils sont utiles dans des situations réelles telles que les gestionnaires d'événements, où la fermeture peut toujours accéder aux variables externes même si elles sont détruites.

Les avantages des expressions lambda dans la programmation multithread C++ incluent la simplicité, la flexibilité, la facilité de passage des paramètres et le parallélisme. Cas pratique?: utilisez des expressions lambda pour créer des multi-threads et imprimer des ID de thread dans différents threads, démontrant la simplicité et la facilité d'utilisation de cette méthode.

Java8 calcule la date il y a un an ou un an plus tard à l'aide de la méthode minus() pour calculer la date il y a un an packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUni

Les expressions C++ Lambda prennent en charge les fermetures, qui enregistrent les variables de portée de fonction et les rendent accessibles aux fonctions. La syntaxe est [capture-list](parameters)->return-type{function-body}. capture-list définit les variables à capturer. Vous pouvez utiliser [=] pour capturer toutes les variables locales par valeur, [&] pour capturer toutes les variables locales par référence, ou [variable1, variable2,...] pour capturer des variables spécifiques. Les expressions Lambda ne peuvent accéder qu'aux variables capturées mais ne peuvent pas modifier la valeur d'origine.

En C++, vous pouvez utiliser des expressions Lambda comme paramètres de fonction pour bénéficier de la flexibilité des fonctions de rappel. Plus précisément?:?passage de paramètres?: encapsulez l'expression Lambda via std::function et transmettez-la à la fonction sous la forme d'un pointeur de fonction. Traitement de la valeur de retour?: spécifiez le type de valeur de retour lors de la déclaration du pointeur de fonction de rappel à l'aide de std::function. Cas pratique?: optimisez les rappels dans le traitement des événements de l'interface graphique, évitez de créer des objets ou des pointeurs de fonction inutiles et améliorez la simplicité et la maintenabilité du code.

Il existe trois fa?ons de capturer des expressions lambda de variables externes en C++ : Capture par valeur : créez une copie de la variable. Capture par référence?: obtenez une référence de variable. Capture par valeur et référence simultanément?: permet de capturer plusieurs variables, soit par valeur, soit par référence.

Comment effectuer une évaluation paresseuse à l'aide d'expressions lambda C++?? Utilisez des expressions lambda pour créer des objets fonction évalués paresseusement. Le calcul retardé diffère l’exécution jusqu’à ce qu’il soit nécessaire. Calculez les résultats uniquement lorsque cela est nécessaire, améliorant ainsi les performances.
