Java sur cette page 1.8 Il est assemblé avec.
-Trier les classes de la liste dans un ordre spécifique ・ Essayez d'utiliser Stream ・ N'utilisez pas le comparateur
Hoge.java
private class Hoge {
private final String priority;
private final String name;
private Hoge(String priority, String name) {
this.priority = priority;
this.name = name;
}
}
Comme ça. Il n'y a pas de getter / setter car c'est gênant.
private List<Hoge> createList() {
List<Hoge> list = new ArrayList<>();
list.add(new Hoge("Hoge 1S", "S"));
list.add(new Hoge("Hoge 2A", "A"));
list.add(new Hoge("Hoge 3SS", "SS"));
list.add(new Hoge("Hoge 4B", "B"));
list.add(new Hoge("Hoge 5A", "A"));
list.add(new Hoge("Hoge 6SS", "SS"));
return list;
}
C'est un échantillon, simple est le meilleur w Donc ça ressemble à ça.
Ceci avec priorité SS > S > A > B Essayez d'organiser dans l'ordre de
public static void main(String[] args) {
List<Hoge> list = createList();
Stream.of(
list.stream().filter(o -> "SS".equals(o.priority)),
list.stream().filter(o -> "S".equals(o.priority)),
list.stream().filter(o -> "A".equals(o.priority)),
list.stream().filter(o -> "B".equals(o.priority))
).flatMap(s -> s).forEach(h -> System.out.println(h.name));
}
La seule mention spéciale est comment utiliser flatMap, qui semble inutile à première vue? Si vous ne l'utilisez pas ici, ce sera Stream \ <Stream \ <Hoge > >. Ici, je veux le faire Stream \ <Hoge >, donc ça ressemble à ceci.
Hoge 3SS Hoge 6SS Hoge 1S Hoge 2A Hoge 5A Hoge 4B
Terminé pour le moment.
Stream.of(
list.stream().filter(o -> "SS".equals(o.priority)),
list.stream().filter(o -> "S".equals(o.priority)),
list.stream().filter(o -> "A".equals(o.priority)),
list.stream().filter(o -> "B".equals(o.priority))
)
Je veux faire quelque chose à propos de cette partie ...
Pour le moment, essayez de le remplacer par le type Predicate.
Predicate<Hoge> isSs = o -> "SS".equals(o.priority);
Predicate<Hoge> isS = o -> "S".equals(o.priority);
Predicate<Hoge> isA = o -> "A".equals(o.priority);
Predicate<Hoge> isB = o -> "B".equals(o.priority);
Stream.of(
list.stream().filter(isSs),
list.stream().filter(isS),
list.stream().filter(isA),
list.stream().filter(isB)
).flatMap(s -> s).forEach(h -> System.out.println(h.name));
C'est subtil. C'est un peu qu'il existe 4 types de prédicat. ..
Les quatre fonctions du type Prédicat ne modifient que la pièce avant égale, Je me demande si je peux réussir à ne passer que cette partie String?
C'est comme passer une chaîne et renvoyer un type de prédicat. Alors, incluons-le dans le type Function.
Function<String, Predicate<Hoge>> priority = p -> new Predicate<Hoge>(){
@Override
public boolean test(Hoge t) {
return p.equals(t.priority);
}
};
Stream.of(
list.stream().filter(priority.apply("SS")),
list.stream().filter(priority.apply("S")),
list.stream().filter(priority.apply("A")),
list.stream().filter(priority.apply("B"))
).flatMap(s -> s).forEach(h -> System.out.println(h.name));
Je l'ai écrit une fois dans une classe anonyme, mais je pense que c'est beaucoup mieux.
Convertissez les classes anonymes en lambda.
Function<String, Predicate<Hoge>> priority = p -> t -> { return p.equals(t.priority); }
Vous n'avez même pas besoin d'un retour. Prenons-le.
Function<String, Predicate<Hoge>> priority = p -> t -> p.equals(t.priority);
Stream.of(
list.stream().filter(priority.apply("SS")),
list.stream().filter(priority.apply("S")),
list.stream().filter(priority.apply("A")),
list.stream().filter(priority.apply("B"))
).flatMap(s -> s).forEach(h -> System.out.println(h.name));
Il s'est avéré être quelque chose comme ça. Sera-ce un peu plus gérable?
Recommended Posts