Maison Java javaDidacticiel Interpréter les nouvelles fonctionnalités de Java8--le rôle de lambda

Interpréter les nouvelles fonctionnalités de Java8--le rôle de lambda

Jun 17, 2017 pm 02:11 PM
java8 作用 特性 解读

Nous attendons depuis longtemps que lambda apporte le concept de fermeture à Java, mais si nous ne l'utilisons pas dans les collections, nous perdrons beaucoup de valeur. Le problème de la migration des interfaces existantes vers le style lambda a été résolu grâce aux méthodes par défaut. Dans cet article, nous analyserons en profondeur les opérations de données par lots dans les collections Java et percerons le mystère de l'effet le plus puissant de lambda.

Nous attendons depuis longtemps que lambda apporte le concept de fermeture à Java, mais si nous ne l'utilisons pas dans les collections, nous perdrons beaucoup de valeur. Le problème de la migration des interfaces existantes vers le style lambda a été résolu grâce à des méthodes par défaut. Dans cet article, nous analyserons en profondeur l'opération de données en masse (opération en masse) dans les collections Java et percerons le mystère du rôle le plus puissant de lambda.

1. À propos de JSR335

JSR est l'abréviation de Java Spécification Requests, qui signifie demande de spécification Java, la version principale de Java 8 Une amélioration est le projet Lambda (JSR 335), qui vise à rendre Java plus facile à coder pour les processeurs multicœurs.

2. Itération externe VS interne

Dans le passé, les collections Java n'étaient pas capables d'exprimer une itération interne, mais seulement fourni Une méthode d'itération externe est fournie, c'est-à-dire une boucle for ou while .


List persons = asList(new Person("Joe"), new Person("Jim"), new Person("John"));
for (Person p : persons) {
 p.setLastName("Doe");
}
Copier après la connexion

L'exemple ci-dessus est notre approche précédente, qui est ce qu'on appelle l'itération externe. La boucle est une boucle à séquence fixe. À l'ère multicœur d'aujourd'hui, si nous voulons paralléliser la boucle, nous devons modifier le code ci-dessus. La mesure dans laquelle l'efficacité peut être améliorée est encore incertaine, et cela entraînera certains risques (problèmes de sécurité des threads, etc.).

Pour décrire l'itération interne, nous devons utiliser une bibliothèque de classes comme Lambda. Utilisons lambda et Collection.forEach pour réécrire la boucle ci-dessus


persons.forEach(p->p.setLastName("Doe"));
Copier après la connexion

Maintenant, la bibliothèque jdk contrôle la boucle. Nous n'avons plus besoin de nous soucier de la façon dont le nom de famille est défini pour chaque objet personne. La bibliothèque peut décider comment le faire en fonction. l'environnement d'exécution. Faites-le en parallèle, dans le désordre ou en chargement paresseux. Il s'agit d'une itération interne et le client transmet le comportement p.setLastName sous forme de données dans l'API. En fait, l'itération interne n'est pas étroitement liée au fonctionnement par lots des collections. Avec elle, on peut ressentir les changements dans l'expression grammaticale. La chose vraiment intéressante liée aux opérations par lots est la nouvelle API de flux. Le nouveau package java.util.stream a été ajouté au JDK 8.

3. API Stream

Le flux représente uniquement un flux de données et n'a pas de structure de données, il a donc été parcouru. ne peut plus être parcouru après une seule fois (cela doit être noté lors de la programmation, contrairement à Collection, il contient toujours des données quel que soit le nombre de fois où il est parcouru. Sa source peut être Collection, tableau, io, etc.).

3.1 Méthodes intermédiaires et finales

La fonction stream fournit une interface pour exploiter le Big Data, permettant aux données opérations Plus faciles et plus rapides. Il dispose de méthodes telles que le filtrage, le mappage et la réduction du nombre de parcours. Ces méthodes sont divisées en deux types : les méthodes intermédiaires et les méthodes terminales. L'abstraction "stream" doit être continue par nature. Les méthodes intermédiaires renvoient toujours un Stream, donc si. nous voulons obtenir le résultat final. Si tel est le cas, les opérations de point final doivent être utilisées pour collecter les résultats finaux produits par le flux. La différence entre ces deux méthodes est de regarder sa valeur de retour. S'il s'agit d'un Stream, c'est une méthode intermédiaire, sinon c'est une méthode de fin.

Une brève introduction à plusieurs méthodes intermédiaires (filtre, carte) et méthodes de point final (collecte, somme)

3.1.1Filtre

Implémenter la fonction de filtrage dans le flux de données est l'opération la plus naturelle à laquelle on puisse penser. L'interface Stream expose une méthode de filtre, qui peut accepter une implémentation de Predicate représentant une opération pour utiliser une lambdaexpression qui définit les conditions de filtre.


List persons = …
Stream personsOver18 = persons.stream().filter(p -> p.getAge() > 18);//过滤18岁以上的人
Copier après la connexion

3.1.2Carte

Supposons que nous filtrions certaines données maintenant, par exemple lors de la conversion d'objets. L'opération Map nous permet d'exécuter une implémentation de Function (les T et R génériques de Function représentent respectivement l'entrée et le résultat de l'exécution), qui accepte les paramètres d'entrée et les renvoie. Voyons d’abord comment la décrire comme une classe interne anonyme :


Stream adult= persons
    .stream()
    .filter(p -> p.getAge() > 18)
    .map(new Function() {
     @Override
     public Adult apply(Person person) {
      return new Adult(person);//将大于18岁的人转为成年人
     }
    });
Copier après la connexion

Maintenant, convertissez l’exemple ci-dessus en une expression lambda :


Stream map = persons.stream()
     .filter(p -> p.getAge() > 18)
     .map(person -> new Adult(person));
Copier après la connexion

3.1.3Count

La méthode count est la méthode du point final d'un flux, qui peut être utilisée La finale les statistiques des résultats de flux reviennent à int. Par exemple, calculons le nombre total de personnes âgées de 18 ans ou plus


int countOfAdult=persons.stream()
      .filter(p -> p.getAge() > 18)
      .map(person -> new Adult(person))
      .count();
Copier après la connexion

3.1.4Collecter

La méthode de collecte est également une méthode de point final du flux, qui peut collecter le résultat final


List adultList= persons.stream()
      .filter(p -> p.getAge() > 18)
      .map(person -> new Adult(person))
      .collect(Collectors.toList());
Copier après la connexion

Ou, si nous voulons utiliser une classe d'implémentation spécifique Pour collecter les résultats :


List adultList = persons
     .stream()
     .filter(p -> p.getAge() > 18)
     .map(person -> new Adult(person))
     .collect(Collectors.toCollection(ArrayList::new));
Copier après la connexion

篇幅有限,其他的中间方法和终点方法就不一一介绍了,看了上面几个例子,大家明白这两种方法的区别即可,后面可根据需求来决定使用。

3.2顺序流与并行流

每个Stream都有两种模式:顺序执行和并行执行。

顺序流:


List <Person> people = list.getStream.collect(Collectors.toList());
Copier après la connexion

并行流:


List <Person> people = list.getStream.parallel().collect(Collectors.toList());
Copier après la connexion

顾名思义,当使用顺序方式去遍历时,每个item读完后再读下一个item。而使用并行去遍历时,数组会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。

3.2.1并行流原理:


List originalList = someData;
split1 = originalList(0, mid);//将数据分小部分
split2 = originalList(mid,end);
new Runnable(split1.process());//小部分执行操作
new Runnable(split2.process());
List revisedList = split1 + split2;//将结果合并
Copier après la connexion

大家对hadoop有稍微了解就知道,里面的 MapReduce 本身就是用于并行处理大数据集的软件框架,其 处理大数据的核心思想就是大而化小,分配到不同机器去运行map,最终通过reduce将所有机器的结果结合起来得到一个最终结果,与MapReduce不同,Stream则是利用多核技术可将大数据通过多核并行处理,而MapReduce则可以分布式的。

3.2.2顺序与并行性能测试对比

如果是多核机器,理论上并行流则会比顺序流快上一倍,下面是测试代码


long t0 = System.nanoTime();

  //初始化一个范围100万整数流,求能被2整除的数字,toArray()是终点方法

  int a[]=IntStream.range(0, 1_000_000).filter(p -> p % 2==0).toArray();

  long t1 = System.nanoTime();

  //和上面功能一样,这里是用并行流来计算

  int b[]=IntStream.range(0, 1_000_000).parallel().filter(p -> p % 2==0).toArray();

  long t2 = System.nanoTime();

  //我本机的结果是serial: 0.06s, parallel 0.02s,证明并行流确实比顺序流快

  System.out.printf("serial: %.2fs, parallel %.2fs%n", (t1 - t0) * 1e-9, (t2 - t1) * 1e-9);
Copier après la connexion

3.3关于Folk/Join框架

应用硬件的并行性在java 7就有了,那就是 java.util.concurrent 包的新增功能之一是一个 fork-join 风格的并行分解框架,同样也很强大高效,有兴趣的同学去研究,这里不详谈了,相比Stream.parallel()这种方式,我更倾向于后者。

4.总结

如果没有lambda,Stream用起来相当别扭,他会产生大量的匿名内部类,比如上面的3.1.2map例子,如果没有default method,集合框架更改势必会引起大量的改动,所以lambda+default method使得jdk库更加强大,以及灵活,Stream以及集合框架的改进便是最好的证明。

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Analyse de la fonction et du principe de nohup Analyse de la fonction et du principe de nohup Mar 25, 2024 pm 03:24 PM

Analyse du rôle et du principe de nohup Dans les systèmes d'exploitation Unix et de type Unix, nohup est une commande couramment utilisée pour exécuter des commandes en arrière-plan. Même si l'utilisateur quitte la session en cours ou ferme la fenêtre du terminal, la commande peut. continuent toujours à être exécutés. Dans cet article, nous analyserons en détail la fonction et le principe de la commande nohup. 1. Le rôle de nohup : Exécuter des commandes en arrière-plan : Grâce à la commande nohup, nous pouvons laisser les commandes de longue durée continuer à s'exécuter en arrière-plan sans être affectées par la sortie de l'utilisateur de la session du terminal. Cela doit être exécuté

Comment afficher le suffixe de fichier sous le système Win11 ? Interprétation détaillée Comment afficher le suffixe de fichier sous le système Win11 ? Interprétation détaillée Mar 09, 2024 am 08:24 AM

Comment afficher le suffixe de fichier sous le système Win11 ? Explication détaillée : Dans le système d'exploitation Windows 11, le suffixe de fichier fait référence au point après le nom du fichier et aux caractères qui le suivent, qui est utilisé pour indiquer le type de fichier. Par défaut, le système Windows 11 masque le suffixe du fichier, de sorte que seul le nom du fichier puisse être vu dans l'explorateur de fichiers mais que le type du fichier ne puisse pas être compris intuitivement. Cependant, pour certains utilisateurs, l'affichage des suffixes de fichiers est nécessaire car cela les aide à mieux identifier les types de fichiers et à effectuer les opérations associées.

Comprendre le rôle et l'utilisation de Linux DTS Comprendre le rôle et l'utilisation de Linux DTS Mar 01, 2024 am 10:42 AM

Comprendre le rôle et l'utilisation de LinuxDTS Dans le développement de systèmes Linux embarqués, l'arborescence des périphériques (DeviceTree, DTS en abrégé) est une structure de données qui décrit les périphériques matériels, leurs relations de connexion et leurs attributs dans le système. L'arborescence des périphériques permet au noyau Linux de s'exécuter de manière flexible sur différentes plates-formes matérielles sans modifier le noyau. Dans cet article, la fonction et l'utilisation de LinuxDTS seront présentées et des exemples de code spécifiques seront fournis pour aider les lecteurs à mieux comprendre. 1. Rôle de l'arborescence des appareils

Explorez l'importance et le rôle de la fonction de définition en PHP Explorez l'importance et le rôle de la fonction de définition en PHP Mar 19, 2024 pm 12:12 PM

L'importance et le rôle de la fonction de définition en PHP 1. Introduction de base à la fonction de définition En PHP, la fonction de définition est une fonction clé utilisée pour définir des constantes. Les constantes ne changeront pas leurs valeurs pendant l'exécution du programme. Les constantes définies à l'aide de la fonction de définition sont accessibles tout au long du script et sont globales. 2. La syntaxe de la fonction de définition La syntaxe de base de la fonction de définition est la suivante : définir("nom constant","valeur constante&qu

A quoi sert PHP ? Explorez le rôle et les fonctions de PHP A quoi sert PHP ? Explorez le rôle et les fonctions de PHP Mar 24, 2024 am 11:39 AM

PHP est un langage de script côté serveur largement utilisé dans le développement Web. Sa fonction principale est de générer du contenu Web dynamique. Lorsqu'il est combiné avec HTML, il peut créer des pages Web riches et colorées. PHP est puissant. Il peut effectuer diverses opérations de base de données, opérations sur les fichiers, traitement de formulaires et autres tâches, offrant ainsi une interactivité et des fonctionnalités puissantes pour les sites Web. Dans les articles suivants, nous explorerons plus en détail le rôle et les fonctions de PHP, avec des exemples de code détaillés. Tout d’abord, jetons un coup d’œil à une utilisation courante de PHP : la génération de pages Web dynamiques : P

Existe-t-il des fonctionnalités orientées objet de type classe dans Golang ? Existe-t-il des fonctionnalités orientées objet de type classe dans Golang ? Mar 19, 2024 pm 02:51 PM

Il n'y a pas de concept de classe au sens traditionnel dans Golang (langage Go), mais il fournit un type de données appelé structure, à travers lequel des fonctionnalités orientées objet similaires aux classes peuvent être obtenues. Dans cet article, nous expliquerons comment utiliser les structures pour implémenter des fonctionnalités orientées objet et fournirons des exemples de code concrets. Définition et utilisation des structures Examinons d'abord la définition et l'utilisation des structures. Dans Golang, les structures peuvent être définies via le mot-clé type, puis utilisées si nécessaire. Les structures peuvent contenir des attributs

Qu'est-ce que Linux Bashrc ? Interprétation détaillée Qu'est-ce que Linux Bashrc ? Interprétation détaillée Mar 20, 2024 pm 09:18 PM

LinuxBashrc est un fichier de configuration du système Linux, utilisé pour définir l'environnement Bash (BourneAgainShell) de l'utilisateur. Le fichier Bashrc stocke des informations telles que les variables d'environnement et les scripts de démarrage requis pour la connexion de l'utilisateur, et peut personnaliser l'environnement Shell de l'utilisateur. Dans le système Linux, chaque utilisateur dispose d'un fichier Bashrc correspondant, situé dans un dossier caché du répertoire personnel de l'utilisateur. Les principales fonctions du fichier Bashrc sont les suivantes : mise en place de l'environnement

Qu'est-ce que le Crypto GPT ? Pourquoi le Crypto GPT de 3EX est-il une nouvelle entrée dans le cercle monétaire ? Qu'est-ce que le Crypto GPT ? Pourquoi le Crypto GPT de 3EX est-il une nouvelle entrée dans le cercle monétaire ? Jul 16, 2024 pm 04:51 PM

Qu’est-ce que CryptoGPT ? Pourquoi le CryptoGPT de 3EX est-il considéré comme une nouvelle entrée dans le cercle monétaire ? Selon les informations du 5 juillet, la plateforme de trading 3EXAI a officiellement lancé CryptoGPT, un projet innovant basé sur la technologie de l'IA et le big data, visant à fournir des requêtes d'informations complètes et intelligentes et des conseils d'investissement par l'IA aux investisseurs mondiaux en crypto. CryptoGPT a inclus les 200 meilleurs jetons de CoinMarketCap et des centaines d'informations de haute qualité sur les parties au projet, et prévoit de continuer à se développer. Grâce à CryptoGPT, les utilisateurs peuvent obtenir gratuitement des rapports détaillés de conseil en transactions et des conseils d'investissement en IA, réalisant ainsi une boucle fermée complète allant des services de conseil en informations à la création de stratégies intelligentes et à l'exécution automatique des transactions. Actuellement, le service est gratuit. Nécessaire

See all articles