Java 8, comment puis-je mettre en œuvre une instruction switch à l'aide de flux?
J'ai un fichier texte imgui.ini
contenant:
[Debug]
Pos=7,79
Size=507,392
Collapsed=0
[ImGui Demo]
Pos=320,5
Size=550,680
Collapsed=0
Pour chaque "élément" j'ai toujours Pos
, Size
et Collapsed
et j'ai besoin de les lire.
Je voudrais l'utiliser, si possible, java 8 ruisseaux.
Est-il possible de simuler une instruction switch comportement?
try (Stream<String> stream = Files.lines(Paths.get(context.io.iniFilename))) {
...
/*
switch(string) {
case "Pos":
settings.pos = value;
break;
case "Size":
settings.size = value;
break;
case "Collapsed":
settings.collapsed = value;
break;
}
*/
} catch (IOException e) {
}
}
Votre question n'est pas claire - ce qui sont que vous essayez d'allumer? Il semble que vous pourriez voulez premier écrire une méthode qui lit les lignes et renvoie un
Commencez par montrer ce que vous voulez faire avec une instruction switch sans le Flux
Question modifié
Je pense que le flux est idéal lorsque l'ordre des entrées est insignifiant. Dans votre ini exemple, toutefois, l'ordre des lignes est critique. Ainsi, l'élément de haut-niveau de flux ne doit pas être des lignes de texte, mais les sections de configuration. Et chaque section est constituée d'un flux de l'ordre-insensible lignes de texte.
Marteau ... à ongles?
Map<String, ConfigurationBlock>
(où ConfigurationBlock
est votre propre type, ou peut-être utiliser Properties
).Commencez par montrer ce que vous voulez faire avec une instruction switch sans le Flux
Question modifié
Je pense que le flux est idéal lorsque l'ordre des entrées est insignifiant. Dans votre ini exemple, toutefois, l'ordre des lignes est critique. Ainsi, l'élément de haut-niveau de flux ne doit pas être des lignes de texte, mais les sections de configuration. Et chaque section est constituée d'un flux de l'ordre-insensible lignes de texte.
Marteau ... à ongles?
OriginalL'auteur elect | 2016-05-27
Vous devez vous connecter pour publier un commentaire.
La meilleure façon d'analyser un tel fichier (sans l'aide d'dédié 3ème partie les bibliothèques), à l'est par l'expression régulière de l'API, et son front-end class
Scanner
. Malheureusement, le meilleur des opérations à mettre en œuvre via des Flux API, sont actuellement manquantes. À savoir,Matcher.les résultats()
etScanner.findAll(...)
ne sont pas encore là. De sorte que si nous voulons attendre jusqu'à ce que Java 9, nous avons à créer des méthodes similaires pour Java 8 une solution compatible:À l'aide de méthodes similaires, sémantique nous permet de remplacer leur utilisation avec l'API standard de méthodes, une fois Java 9 est libéré et devient monnaie courante.
À l'aide de ces deux opérations, vous pouvez analyser votre fichier à l'aide de
la carte
m
contient toutes les informations d', la correspondance entre les noms de groupe à l'autre de la carte holding les paires clé/valeur, c'est à dire que vous pouvez imprimer un équivalent.ini
fichier à l'aide de:OriginalL'auteur Holger
Tentative:
OriginalL'auteur Vasco
En se concentrant sur la question "est-il un moyen de simuler l'instruction switch comportement", je pense que la réponse est que vous pouvez, avec un peu d'effort. Je me suis demandé qui il y a quelques années, et ne le suit comme un exercice (et puis jamais utilisé de nouveau):
testAndConsume
compose d'unPredicate
et unConsumer
, la création d'unPredicate
qui renvoie la même valeur mais les appels de laConsumer
comme un effet secondaire si la valeur est true. Que devient la base pour chaque "cas" dans le "switch". Chaque "cas" est enchaînent les unes aux autres parPredicate.or()
, qui fournit le court-circuit "sinon si" la nature de l'interrupteur. Enfin, le composéPredicate
est transformé en unConsumer
en ajoutant::test
à laPredicate
.En l'appliquant à votre extrait de code, il ressemble à ceci:
C'est sur que de passer à la rigueur, car il peut faire sans un changement réel dans un
Consumer
corps.OriginalL'auteur Hank D
Une autre façon de lire votre fichier de configuration:
Résultat sera la carte:
OriginalL'auteur Alexander Ivanov