Peut utiliser des opérations fonctionnelles

j'utilise la construction for-each En Java comme suit:

public int getNumRStations() {
    int numRoutes = 0;

    for (ArrayList<Route> route : routes) {
        numRoutes += route.size();
    }

    return numRoutes;
}

NetBeans affiche un avertissement / notice qui dit"peut utiliser des opérations fonctionnelles". Après l'avoir résolu automatiquement, le code nouvellement généré affiche ceci:

public int getNumRStations() {
    int numRoutes = 0;

    numRoutes = routes.stream().map((route) -> route.size()).reduce(numRoutes, Integer::sum);

    return numRoutes;
}
  1. pourquoi NetBeans me prévient-il de cela? Je sais que je ne suis pas censé faire confiance aux IDEs, donc c'est pour ça que je demande.
  2. qu'est-Ce que la nouvelle ligne censé faire? Je n'ai pas vu quelque chose comme ça, dans la vraie vie ou dans classe.
19
demandé sur rink.attendant.6 2014-08-14 07:50:03

2 réponses

cela ressemble à NetBeans suggérant le remaniement de votre opération de Somme comme un Java 8 "lambda" ou opération de programmation fonctionnelle en utilisant la carte et réduire les fonctions de l'interface de flux. Vous devez utiliser un Java 8 JDK avec NetBeans.

Briser ce qu'il fait:

  • la fonction" map () " effectue un compte de tous vos route tailles dans votre routes liste des tableaux,

  • "réduire()" est alors effectuer une somme de ces tailles individuelles pour obtenir le résultat final pour le nombre total de routes.

les fonctions map() et reduce () sont documentées dans la documentation Java 8 pour l'interface Stream disponible sur ce lien

Cette réponse s'adresse à "ce qu'il est", mais n'a pas d'adresse "pourquoi c'est mieux". J'admets encore à apprendre sur ces constructions moi-même.

13
répondu paisanco 2016-02-05 07:36:19

donc @paisanco a déjà expliqué ce que fait chaque fonction.

je suis d'accord que la modification suggérée par L'IDE est plus complexe que l'originale.

Si on m'a demandé de choisir entre l'original et la recommandation de L'IDE, alors je choisirai l'original.

cependant, voici une façon plus simple (et plus préférée) pour votre exemple.

public int getNumRStations() {
    return routes.stream().mapToInt(x -> x.size()).sum();
}

L'explication est plus simple dans ce cas aussi.

Pour chacun des itinéraires de l'élément x, en x.size() et résumez-les.

x -> x.size() s'appelle une expression lambda, ou fonction anonyme. C'est comme

int function(x) {
    return x.size();
}

(j'ai omis le type de paramètre. Le type est implicitement sélectionné par le compilateur Java.)

Cette fonction est appliquée à chacun des éléments de la collection. C'est ce que mapToInt(lambda exp) la méthode fait.

sum() méthode ne semble pas nécessiter d'explication.

Simple, n'est-ce pas?

8
répondu Naetmul 2014-08-15 01:26:12