Trouver un objet avec la valeur la plus basse et renvoyer l'objet, pas la valeur, avec un flux

StackOverflow https://stackoverflow.com//questions/23016965

  •  21-12-2019
  •  | 
  •  

Question

Je trouve actuellement l'objet avec la valeur la plus basse comme ceci :

List<Location> locations = new ArrayList<Location>();
RGB colour = new RGB(5,3,7);
Location best = null;
double bestscore = 0.0;
for(Location loc : locations)
{
  if(best == null)
  {
    best = loc;
    bestscore = getScore(loc,colour, average);
  }
  else
  {
    double oscore = getScore(loc,colour, average);
    if(oscore < bestscore)
    {
      best = loc;
      bestscore = oscore;
    }
  }
}

où getScore est :

double getScore(Location loc, RGB colour, boolean average)

C'est assez lent étant donné que les emplacements comportent généralement quelques milliers d'entrées et que cette boucle est utilisée plusieurs millions de fois de suite.

Je voulais donc essayer d'utiliser le nouveau parallelStream() de Java 8.J'ai créé un comparateur qui compare les valeurs getScore.

Location best = locations.parallelStream().min(new ComparatorScoreDif(colour)).get();

Est-ce que je vais dans la bonne direction ici, est-ce la bonne façon de procéder ?

Était-ce utile?

La solution

Location best = locations.parallelStream().min(new ComparatorScoreDif(colour)).get();

Cela renverra l'objet réel de l'objet facultatif.ça, ça existe.Vous pourriez appeler .isPresent() sur l'objet facultatif au préalable pour vérifier cela.

Est-ce que je vais dans la bonne direction ici, est-ce la bonne façon de procéder ?

Oui c'est le cas.En appelant .parallelStream() vous confiez la partie concurrence à la JVM (il partitionnera le flux en plusieurs sous-flux) et vous pouvez vous concentrer sur la logique réelle qui doit être exécutée en parallèle.

Voir OracleDocs - Parallélisme pour plus d'informations et de belles explications.

Autres conseils

Oui, en utilisant min() avec un Comparator est la bonne approche pour ce faire.Cependant, vous n'avez pas besoin de créer votre propre implémentation de comparateur. ComparatorScoreDif.Au lieu de cela, vous pouvez utiliser le Comparator.comparing fonction combinateur pour générer un Comparator, étant donné une fonction qui dérive les valeurs à comparer.

La plupart des exemples utilisent des références de méthode aux getters sur l'objet comparé.Si Location avait un getScore méthode, on ferait ceci:

Location best = locations.parallelStream()
                         .min(Comparator.comparing(Location::getScore))
                         .get();

Cependant, getScore n'est-ce pas une méthode sur Location, et cela prend quelques paramètres supplémentaires.Cela nécessitera d'écrire une expression lambda "à la main" au lieu d'utiliser une référence de méthode.Les valeurs supplémentaires peuvent être capturées à partir de l'environnement :

Location best = locations.parallelStream()
                         .min(Comparator.comparingDouble(loc -> getScore(loc, colour, average)))
                         .get();

Cela évite d'avoir à écrire une classe à implémenter Comparator.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top