Maison >Java >javaDidacticiel >Introduction à l'utilisation du prédicat dans java8 (exemple de code)
Cet article vous apporte une introduction à l'utilisation du prédicat dans Java 8 (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
Code d'accès
Regardons d'abord un exemple Supposons que vous ayez une classe Apple, qui a une méthode getColor et un inventaire variable qui contient une liste de pommes. . Vous souhaiterez peut-être sélectionner toutes les pommes vertes et renvoyer une liste. Nous utilisons généralement le mot filtre pour exprimer ce concept. Avant Java 8, vous pouviez écrire une telle méthode filterGreenApples :
public static List<Apple> filterGreenApples(List<Apple> inventory){ List<Apple> result = new ArrayList<>(); for (Apple apple: inventory){ if ("green".equals(apple.getColor())) { result.add(apple); } } return result; }
Mais alors, quelqu'un pourrait vouloir sélectionner des pommes lourdes, comme plus de 150 grammes, alors vous avez écrit ce qui suit avec le cœur lourd This
utilise même le copier-coller :
public static List<Apple> filterHeavyApples(List<Apple> inventory){ List<Apple> result = new ArrayList<>(); for (Apple apple: inventory){ if (apple.getWeight() > 150) { result.add(apple); } } return result; }
Nous connaissons tous les dangers du copier-coller en génie logiciel - mettre à jour et corriger l'un, mais oublier l'autre. Hé, il n'y a qu'une seule ligne de différence entre ces
deux méthodes : la ligne de condition en surbrillance dans if. Si la différence entre les deux méthodes mises en évidence réside uniquement dans la plage de poids qui accepte
, il vous suffit alors de transmettre les limites supérieure et inférieure du poids accepté en tant que paramètres du filtre, par exemple en spécifiant
(150, 1000 ) pour sélectionner des pommes plus lourdes (plus de 150 grammes), ou spécifiez (0, 80) pour sélectionner des pommes légères (moins de 80 grammes).
Cependant, comme nous l'avons mentionné précédemment, Java 8 transmettra le code conditionnel en tant que paramètre, ce qui peut éviter la duplication de code dans la méthode de filtrage
. Vous pouvez maintenant écrire :
public static boolean isGreenApple(Apple apple) { return "green".equals(apple.getColor()); } public static boolean isHeavyApple(Apple apple) { return apple.getWeight() > 150; } static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) { List<Apple> result = new ArrayList<>(); for (Apple apple: inventory){ if (p.test(apple)) { result.add(apple); } } return result; }
Pour l'utiliser, vous pouvez écrire :
filterApples(inventory, Apple::isGreenApple);
ou
filterApples(inventory, Apple:: isHeavyApple );
Qu'est-ce qu'un prédicat ?
Le code précédent transmet la méthode Apple::isGreenApple (qui accepte le paramètre Apple et renvoie unPasser des méthodes à LambdaPasser des méthodes en tant que valeurs est évidemment utile, mais lorsqu'il s'agit de méthodes courtes comme isHeavyApple et isGreenApple qui
booléen) à filterApples, qui s'attend à accepter un paramètre PredicateLe mot prédicat
est souvent utilisé en mathématiques pour représenter quelque chose comme une fonction, qui accepte une valeur de paramètre et renvoie vrai ou faux. Comme vous
le verrez plus tard, Java 8 vous permettra également d'écrire Function- les lecteurs qui ont appris les fonctions à l'école mais pas les
prédicats seront peut-être plus familiers avec cela, mais utilisez Predicate< est une méthode plus standard et un peu plus efficace. Elle évite d'encapsuler le booléen dans le booléen.
ne peuvent être utilisées qu'une ou deux fois Écrire un un tas de définitions est un peu ennuyeux. Cependant, Java 8 résout également ce problème. Il introduit un nouvel ensemble de notation
(fonction anonyme ou Lambda), vous permettant d'écrire
filterApples(inventory, (Apple a) -> "green".equals ( a.getColor()) );
ou
filterApples(inventaire, (Apple a) -> a.getWeight() > 150 );
ou même
filterApples(inventaire, (Apple a) -> a.getWeight() < 80 ||
"brown".equals(a.getColor()) );
Le code complet est :
public class FilteringApples1 { public static void main(String[] args) { List<FilteringApples1.Apple> inventory = Arrays.asList(new FilteringApples1.Apple(80, "green"), new FilteringApples1.Apple(155, "green"), new FilteringApples1.Apple(120, "red")); List<FilteringApples1.Apple> greenApples2 = filterApples(inventory, (FilteringApples1.Apple a) -> "green".equals(a.getColor())); System.out.println(greenApples2); // [Apple{color='green', weight=155}] List<FilteringApples1.Apple> heavyApples2 = filterApples(inventory, (FilteringApples1.Apple a) -> a.getWeight() > 150); System.out.println(heavyApples2); // [] List<FilteringApples1.Apple> weirdApples = filterApples(inventory, (FilteringApples1.Apple a) -> a.getWeight() < 80 || "brown".equals(a.getColor())); System.out.println(weirdApples); } public static List<FilteringApples1.Apple> filterApples(List<FilteringApples1.Apple> inventory, Predicate<FilteringApples1.Apple> p) { List<FilteringApples1.Apple> result = new ArrayList<>(); for (FilteringApples1.Apple apple : inventory) { if (p.test(apple)) { result.add(apple); } } return result; } public static class Apple { private int weight = 0; private String color = ""; public Apple(int weight, String color) { this.weight = weight; this.color = color; } public Integer getWeight() { return weight; } public void setWeight(Integer weight) { this.weight = weight; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public String toString() { return "Apple{" + "color='" + color + '\'' + ", weight=" + weight + '}'; } } }java8 La fonction de filtre intégrée <p></p> <pre class="brush:php;toolbar:false">static <T> Collection<T> filter(Collection<T> c, Predicate<T> p);signifie que vous n'avez même pas besoin d'écrire filterApples, car par exemple, l'appel précédent
filterApples(inventory, (Apple a) -> a.getWeight() > 150 );peut appeler directement la méthode de bibliothèque filter :
filter(inventory, (Apple a) -> a.getWeight() > 150 );
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!