Java Flux: groupe une Liste sur une Carte des Cartes
Comment pourrais-je faire ce qui suit avec Java Flux?
Disons que j'ai les classes suivantes:
class Foo {
Bar b;
}
class Bar {
String id;
String date;
}
J'ai un List<Foo>
et je veux le convertir en un Map <Foo.b.id, Map<Foo.b.date, Foo>
. I. e: groupe, d'abord par le Foo.b.id
puis par Foo.b.date
.
J'ai du mal avec les 2 étapes, mais le second n'a même pas compiler:
Map<String, List<Foo>> groupById =
myList
.stream()
.collect(
Collectors.groupingBy(
foo -> foo.getBar().getId()
)
);
Map<String, Map<String, Foo>> output = groupById.entrySet()
.stream()
.map(
entry -> entry.getKey(),
entry -> entry.getValue()
.stream()
.collect(
Collectors.groupingBy(
bar -> bar.getDate()
)
)
);
Merci à l'avance.
Eh bien, êtes-vous sûr que chaque élément de la liste sera unique? C'est, d'un identifiant et d'une date donneront exactement un seul
Voulez-vous un
vous avez raison, édité 🙂
oui
Foo
objet?Voulez-vous un
Map <Foo.b.id, Map<Foo.b.date, Foo.b>
ou un Map <Foo.b.id, Map<Foo.b.date, List<Foo.b>>
?vous avez raison, édité 🙂
oui
OriginalL'auteur mrod | 2015-10-21
Vous devez vous connecter pour publier un commentaire.
Vous pouvez regrouper vos données en une seule fois en supposant qu'il ne sont distinctes
Foo
:En sauver quelques-unes des caractères à l'aide statique importations:
OriginalL'auteur Flown
Supposons que
(b.id, b.date)
paires sont distincts. Si oui,dans la deuxième étape, vous n'avez pas besoin de regroupement, récoltant à
Map
où la clé estfoo.b.date
de la valeur et defoo
lui-même:Ou encore plus simple:
OriginalL'auteur Alex Salauyou
Une alternative est de soutenir l'égalité de contrat sur votre clé,
Bar
:Maintenant, vous pouvez juste avoir un
Map<Bar, Foo>
.Bar
s avec le mêmeid
mais différentsdate
également être stockée, mais dans votre approche, ils seront jetés. Une autre faille dans votre code est null dangereux de comparerid
s--Objects.equals()
est beaucoup mieux pour cela. Et je ne comprends pas quel est le but de la comparaison deo.date
àthis.id
Première déclaration n'est pas vrai, vous pouvez avoir le même id et à des dates différentes, à l'aide de cette méthode. Et comme pour les valeurs null, la Carte ne permet pas les clés null, donc je suppose qu'ils n'en ont pas. Troisième point, c'est une faute de frappe, ce qui affecte probablement le premier point de trop!
Oui, votre modification faite à l'égalité,
id
etdate
, pasid
seulement. Maintenant à la recherche deFoo
vous avez besoin pour créer mannequinBar
objet--certainement, cela peut être une approche. +1oui, c'est vrai. Mais je préfère cela plutôt qu'une carte de cartes, sauf si je voulais effectuer une partielle de recherche, c'est à dire recherche de tout ce qui correspond à une
id
OriginalL'auteur weston