Comment obtenir une liste de valeurs de champs spécifiques à partir d'objets stockés dans une liste?
Dire que j'ai une liste d'objets avec deux champs field1
et field2
à la fois de type Chaîne de caractères.
Comment puis-je obtenir une liste de tous les field1
valeurs sans avoir à effectuer une itération sur la liste, si c'est possible?
source d'informationauteur user1343585
Vous devez vous connecter pour publier un commentaire.
Un objet est une référence vers une adresse mémoire. Ensuite, les champs de cet objet autres références vers d'autres adresses de mémoire.
Par conséquent, une liste d'objets est une liste de références. Ainsi, il est impossible pour la liste de directement accéder à l'objet de champs (références fournies par les références). La réponse courte est non.
Remarque: de toute façon, vous trouverez une API qui fait ce que vous voulez, il a encore des boucles à l'intérieur.
Heureusement, vous pouvez le faire à l'aide de Java 8 - Flux
Supposons que vous disposez d'une entité nommée YourEntity
Déclarer votre liste de YourEntity à l'aide de:
Vous pouvez extraire la liste des champ1 d'un seul coup en cette manière:
Ou de cette façon
Vous pouvez imprimer tous les articles sont également à l'aide de java 8 🙂
Sortie
essayez ceci:
la LambdaJ permet l'accès à des collections sans autorisation explicite des boucles, donc au lieu d'avoir plus de lignes de code pour effectuer une itération de la liste vous-même, vous laissez LambdaJ le faire.
Ni java en tant que langage, ni JDK bibliothèques ne pas faire ce que vous voulez encore. Vous pouvez soit utiliser LambdaJ ou attendre pour Java 8 qui devrait inclure des expressions lambda.
Dépend...
... si vos questions renvoie à
avoiding iterating over the collection
:Concrètement, avez-vous dire:
Voir ci-dessous pour les solutions et les options.
À L'Aide De La Commodité Des Bibliothèques
Si c'est la première, puis de regarder Google Goyave, LambdaJ, FunctionalJava ou d'autres bibliothèques qui mettent en œuvre fonctionnelle de base des constructions et de vous permettre de faire ce que vous voulez dans un peu expressive des appels. Mais gardez à l'esprit ces faire ce qui est dit sur l'étain: ils vont filtrer, de collecte ou de transformation d'une collection, et itérer à travers ses éléments pour ce faire.
Par exemple:
Google Goyave:
Fonctionnel Java:
LambdaJ:
Parfait
Si c'est le second, ce n'est pas possible en l'sauf si vous architecturé tout depuis le début, de sorte que vos objets doivent être gérés par une classe de collection personnalisée qui serait l'indexation de vos objets en fonction de leurs valeurs de champ sur l'insertion.
Il serait de les garder dans des seaux indexées par cette valeur pour être facilement disponible pour vous de récupérer sous forme de liste ou sur demande.
Comme mentionné dans les commentaires ci-dessous dounyy réponse de la conception de cette collection personnalisée aurait probablement un impact sur l'API des éléments de la il accepterait (le plus probable par la définition d'une super interface à utiliser pour les types d'éléments), ou exigerait un assez complexes de mise en œuvre pour résoudre des membres de la dynamique (le plus probable par l'aide de la réflexion), si jamais vous voulais que cette collection soit générique.
Non, vous ne pouvez pas. Vous avez à parcourir l'ensemble de la liste et d'obtenir chaque "champ1" la valeur de chaque objet.
Peut-être vous pouvez créer une table de hachage de cette façon:
La clé serait le terrain.
Faire de cette façon, lorsque vous demandez à la table de hachage pour récupérer vous, l'objet correspondant à la zone que vous voulez, la carte vous fera retourner une liste de tableaux cointaing tous les éléments qui ont ce domaine.
Sans Itération, ce n'est pas possible .Vous pouvez réduire l'itération en quelque sorte, mais il est incontournable.
Ajouter les valeurs des enregistrements dans les différentes listes et par l'utilisation de l'un ou des deux itérateur, il suffit d'imprimer
de différentes valeurs.comme suit:
Oui!! Son possible.
Mais vous avez à faire un peu tordu de travail.
Créer un intérieur de classe avec des variables requises.
Par exemple: ici vais utiliser 2 variables.( TNAME et TABTYPE).
Créer une Liste de l'intérieur de la classe créée ci-dessus et n'oubliez pas de l'encapsuler.
Obtenir la valeur stockée dans la liste comme un intérieur de classe de l'objet.
créer un modèle de données et pousser la liste pour le datamodel
obtenir le warpped de données à une autre liste.
Enfin!!!!! imprimer les données.
TADA !!!! il permet d'imprimer uniquement le nom de la table et de ne pas le tabtype 😉
Croire qu'il n'y a rien d'impossible en java
Aucun doute!!
Ancienne question, mais je suis tombé sur elle tout en regardant pour voir si je pouvais améliorer sur une solution similaire.
Vous pouvez mettre en œuvre la
List<String>
interface sans la création d'un étoffé,ArrayList<String>
et n'est donc pas une itération sur l'objet parent.Qui vous donne une Liste sans itération sur l'objet parent.
L'accès aléatoire à la dérivée
List<String>
sera aussi cher que l'accès aléatoire à la sous-jacentesList<Entity>
; si vous utilisez une mise en œuvre deList<Entity>
qui ne donnent rapidement accès aléatoire, vous pourriez avoir à sauter à travers quelques cerceaux (c'est à dire la mise en œuvre de plusieurs méthodes deList<String>
. Mais cela devrait aussi fonctionner pour 99% des cas où vous avez besoin d'une lumière-poids de l'adaptateur.