Comment faire pour supprimer des éléments d'une liste avec lambda basée sur une autre liste
J'ai la Liste des Chemins d'accès de fichier: .
List<Path> filePaths; //e.g. [src\test\resources\file_exampleFile.pdf]
54
ci-dessus fait référence à l'ID de fichier
Je puis obtenir un Set
de String
Id qui mon application peut gérer comme suit:
Set<String> acceptedIds = connection.getAcceptedIDs(); //e.g. elements [64, 101, 33]
Comment puis-je utiliser Java 8 lambdas à filter
tous les éléments dans filePaths
qui ne contiennent pas de l'Id qui sont contenues dans acceptedIds
Jeu d'éléments de collecte.
En d'autres termes, je tiens à conserver dans filePaths
que les chemins que les id qui sont dans acceptedIds
ensemble. Par exemple, 54 n'est pas dans la liste ci-dessus est donc supprimé.
filePaths.stream().filter(...).collect(Collectors.toList());
- Peut-on s'appuyer sur le répertoire parent d'être nommé avec l'ID?
- filePaths.removeIf(p -> !acceptedIds.contient(p.getPath())
Vous devez vous connecter pour publier un commentaire.
Le moyen le plus efficace est d'extraire l'ID de la voie, puis de tenter de le trouver dans le Jeu, faisant de chaque filtre exécuter en temps constant, c'est à dire
O(1)
qui représenteO(n)
, oùn
est le nombre de chemins:Si l'approche inverse est fait, où chaque
acceptedIds
est recherché dans le chemin d'accès (comme dans les autres réponses), chaque filtre estO(m*k)
, oùm
est le nombre deacceptedIds
etk
est la moyenne de la longueur de Chemin d'accès, ce qui représenteO(n * m * k)
, qui va effectuer très mal, même modérée tailles de collections.trim()
les id des espaces lors de l'extraction ?"src\test\resources\file\15\54 \54_exampleFile.pdf"
(nom de répertoire est"54 "
- avec un espace), ou dans les valeurs stockées dansacceptedIds
?acceptedIds
connection.getAcceptedIDs()
), mais de le faire dans votre méthode,acceptedIds = acceptedIds.stream().map(String::trim).collect(Collectors.toSet());
connection.getAcceptedIDs()
est de lecture de mon modèle de connexion. Dois-je donc de retour de cette méthodereturn acceptedIds.stream().map(String::trim).collect(Collectors.toSet());
est cela que vous voulez dire? Je préfère couper comme vous le dites dans getterSpring EL
,<constructor-arg value="#{'${file.specifiedIds}'.split(',')}"/>
. Je ne pouvais pas voir un moyen de coupe avec EL. Savez-vous si la garniture peut être utilisé avec split dans qu'EL<constructor-arg value="#{'${file.specifiedIds}'.trim().split(' *, *')}"
🙂Vous pourriez écrire:
Ce filtres de chaque chemin de telle sorte qu'au moins l'un des
acceptedIds
est contenue dans la chaîne représentant le chemin d'accès. Vous pourriez mettre en place quelque chose de mieux quecontains
ici, en fonction de votre cas d'utilisation (correspondant au début du nom de fichier par exemple).anyMatch
est une opération qui permet de déterminer si au moins un élément correspond à la donnée de prédicat.Noter que cette réponse ne fait aucune hypothèse sur le chemin de filtrer les éléments. Si vous pouvez sans risque dire que dans chaque chemin, le répertoire parent est nommé avec l'id, vous devriez certainement aller avec @Bohème réponse, pour des raisons de performances.
p.toString().contains(id)
implique"54".contains("4")
ou"543".contains("4")
je doute que cela correspond à l'OP intentions.Comme suit:
Si votre nom de fichier de la structure est constante, je voudrais utiliser une regex premier à extraire le nombre, puis de vérifier si elle est parmi les désiré id.