So i'm working on a project in which I have to convert a String containing greek letters in to a string containing the english representation for this letter. So a greek α would become alpha and Α would become Alpha.
I have created a HashMap which has the appropriate conversions from Unicode Character to a normal String.
I have used a simple For loop to check if a Char in the input String is a Key in the HashMap and if it is then i'll append its replacement using a StringBuilder. Here is the code I use to do this:
char[] ca = snippet.toCharArray();
StringBuilder out = new StringBuilder();
for (char c : ca) {
if (GREEK_LETTER_DICT.containsKey(Character.toString(c))) {
out.append( GREEK_LETTER_DICT.get(Character.toString(c)));
} else {
out.append(c);
}
}
return out.toString();
This is in a public static method with String as input.
The thing I want to know is if it is possible to do the same with a lambda expression? I have already found a couple of solutions replacing a Character in String but they do not use a HashMap/Dictionary.
I understand that it is completely useless to just convert this into a lambda expression for the sake of using a lambda expression, but because I have another 7 of these functions shortening my code by almost 60% I would like to see if it is at all possible to do this in "one line" of code. This way i can decrease the number of separate methods I use and get cleaner code.
So far I have found a way to convert a String to a Stream using:
String.chars()
Then converting this IntStream to a Stream<Character> with
.mapToObj(ch -> (char) ch)
and filtering to see if the Character is in the HashMap with
.filter(ch -> (GREEK_LETTER_DICT.containsKey(ch)))
The problem lies in the fact that I am not able to
- append the original
Characterto the outputStringif it is not in theHashMap - replace the
Characterwith the String in theHashMap
So any help on these two points is appreciated. I found out that sometimes I think the wrong way around because instead of seeing if a Character in a String is equal to a Character in a list of options, I should have checked if that list of options returns a positive index. So this (PseudeoCode):
"StringWithOptions".indexOf('characterLiteral')
instead of this:
Character.equals("One|of|these")
str.chars().forEach(character -> out.append(GREEK_LETTER_DICT.getOrDefault(Character.toString(c), c)));