2017-09-08 1 views
-1

J'aime le style fonctionnel. Donc, voudrais convertir String en Map<Position, Character> en utilisant Java-8 (Si c'est possible fait en java-8). Où:Remplissage de la carte <> en utilisant le style Java8

  • clé doit être le caractère Position,

  • valeur devrait être Character « s ne tiennent pas compte des espaces blancs.

String str = "a b c\nc d e\na b c"; // note \n (new line) 

Map<Position, Character> map; 
    // key  value 
    // (0,0) 'a' 
    // (0,1) 'b' <= skip spaces 
    // (0,2) 'c' 
    // (1,0) 'c' <= reset at new line 
    // ... 
    // (2,2) 'c' 

Jusqu'à présent, je suis venu avec smth comme ça (c'est probablement tout faux):

map = str.chars() 
     .filter(ch -> ch != ' ') 
     .reduce((Map<Position, Character> m, int ch) -> { 
      // put magic here. 
      m.put(new Position(x, y), ch); 
     }); 

Désolé si on a posé une question similaire, mais mon 1 h la recherche n'a pas donnez-moi une réponse assez claire.

+0

Pourquoi voudriez-vous utiliser un style fonctionnel lorsqu'il apparaît qu'un style de procédure va être supérieur? – corsiKa

+0

Dans le style fonctionnel ?? J'aime ça. J'aime le look. et je pense que c'est plus facile à lire. plus je veux apprendre de nouvelles choses. –

+0

Vous pourriez vouloir regarder 'Collectors.toMap()' https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html –

Répondre

0

Voici une option:

Map<Integer, Char> stringMap = IntStream.range(0, str.length()).filter(x -> ! str[x].equals(' ')).collect(Collectors.toMap(x -> x, y -> str[y]) 
// Code should be something like this. Not sure it compiles as is 

Mon java est un peu rouillé, mais je pense que la syntaxe fonctionne toujours.

Je suis un peu préoccupé pourquoi vous feriez cela si et n'utilisez pas String::charAt. Cherchez-vous la mutabilité? Les chaînes de caractères Java sont plutôt optimisées pour l'efficacité de la mémoire.

+0

La classe de position a x & y. Non unique Entier. y devrait être mis à jour puis la nouvelle ligne apparaît. –

+1

Eh bien alors vous portez y entre les itérations et ce n'est donc pas un bon cas pour les cours d'eau.Les flux sont cool pour certaines choses, mais si vous devez porter et changer d'état entre les itérations alors vous n'êtes plus dans les cours d'eau de la rivière. –

+0

Comme je l'ai écrit à la fin de la poste est ce que je suis venu avec googling. Je suis nouveau à java8. J'avais la sensation de la solution Implique IntStream. Mais je ne pouvais pas comprendre comment mettre tous ensemble. Je n'ai pas besoin de mutabilité (la seule valeur de la carte sera mutée, la clé et la taille resteront les mêmes). –