Actuellement, j'ai une méthode surchargeant la méthode suivante:
public boolean isHorizontalOrVertical(Point firstPoint, Point secondPoint) { return firstPoint.getFirstComponent() == secondPoint.getFirstComponent() || firstPoint.getSecondComponent() == secondPoint.getSecondComponent(); } public boolean isHorizontalOrVertical(List<Point> points) { if (points == null || points.size() < 2) { throw new IllegalArgumentException("invalid number of points"); } Point start = points.get(0); return points.stream() .allMatch(p -> isHorizontalOrVertical(start, p)); }
La méthode est nécessaire pour vérifier si deux ou trois points sont verticaux / horizontaux entre eux . Dans le cas de trois points, il suffit de vérifier si les deux derniers points sont horizontaux / verticaux par rapport au point de départ.
Quelqu'un a-t-il une idée de la façon dont je peux tout mettre en une seule méthode?
4 Réponses :
La méthode pourrait être implémentée comme ceci:
private boolean are2PointsHorizontalOrVertical(Point firstPoint, Point secondPoint) { return firstPoint.getFirstComponent() == secondPoint.getFirstComponent() || firstPoint.getSecondComponent() == secondPoint.getSecondComponent(); } public boolean arePointsHorizontalOrVertical(Point point1, Point point2, Point... rest) { return are2PointsHorizontalOrVertical(point1, point2) && Arrays.stream(rest).allMatch(x -> are2PointsHorizontalOrVertical(point1, x)); }
Votre méthode isHorizontalOrVertical (List
échouera lorsque la liste est vide, et l'appel échoue Cela n’a pas beaucoup de sens quand la liste n’a qu’un seul élément.
Je pense qu’une meilleure façon de faire est d’utiliser deux paramètres obligatoires, plus un paramètre variadique, de sorte que les appelants doivent donner au moins 2 points.
public boolean isHorizontalOrVertical(Point firstPoint, Point secondPoint, Point thirdPoint) { return isHorizontalOrVertical(Arrays.asList(firstPoint, secondPoint, thirdPoint)); }
Ceci est techniquement toujours "une méthode" en ce qui concerne l'interface publique. Vous pouvez remplacer l'aide are2PointsHorizontalOrVertical
dans la méthode publique si vous le souhaitez vraiment , mais je ne vois aucun avantage à le faire.
Vous ne pouvez avoir qu'une seule méthode comme suit:
public boolean isHorizontalOrVertical(List<Point> points) { if (points == null || points.size() < 2) { throw new IllegalArgumentException("invalid number of points"); } if (points.size() == 2) { return points.get(0).getFirstComponent() == points.get(1).getFirstComponent() || points.get(0).getSecondComponent() == points.get(1).getSecondComponent(); } Point start = points.get(0); return points.stream() .allMatch(p -> isHorizontalOrVertical(List.of(start, p))); }
Remarque: Si vous n'utilisez pas la version Java> = 9, veuillez utiliser Arrays.asList au lieu de List.of .
Comment return points.stream () .allMatch (p -> isHorizontalOrVertical (start, p));
est censé fonctionner quand il n'y a qu'une seule méthode mais qu'il a besoin de deux arguments?
Qu'entendez-vous par List.of (..)
?
@EugenCovaci - veuillez vérifier stackoverflow.com/questions/46579074/...
Êtes-vous sûr que l'OP utilise la version Java> = 9?
@EugenCovaci - C'est l'hypothèse. Si ce n'est pas le cas, OP fera un commentaire.
J'utilise Java 8
@ArvindKumarAvinash Merci. Serait-il préférable d'utiliser if (points.isEmpty () || ...)
au lieu de if (points == null || ...)
?
Il n'est pas seulement préférable d'utiliser points == null
car points.isEmpty ()
lancera NullPointerException
si points code > est
nul
.
En fait, vous ne pouvez avoir qu'une seule méthode:
public boolean isHorizontalOrVertical(Point firstPoint, Point secondPoint, Point... others) { // check firstPoint, secondPoint for null is ommited if (others == null || others.length == 0) { return firstPoint.getFirstComponent() == secondPoint.getFirstComponent() || firstPoint.getSecondComponent() == secondPoint.getSecondComponent(); } else { // First, create a stream with second point + others elements // then match against the first point return Stream.of(new Point[]{secondPoint}, others).flatMap(e -> Stream.of(e)) .allMatch(p -> isHorizontalOrVertical(firstPoint, p)); } }
Vous pourriez utiliser des arguments variadiques, vous pourriez avoir une fonction qui prend une liste?
Oui, mais à quoi ressemblerait une méthode avec les fonctionnalités requises?
Pourquoi voudriez-vous faire ça? Je renommerais votre deuxième méthode, afin que vous puissiez la lire vérifie si tous les points de la liste sont horizontaux ou verticaux. quelque chose comme:
allPointsAreHorizontalOrVertical
Quel est l'avantage d'exiger de l'appelant qu'il passe deux points sous forme de liste? Si vous ne souhaitez pas exposer la version à deux points dans une API publique, rendez simplement la méthode privée.