I want to transform a string of text to a dictionary, which contains all the unique words as a key, and translation as a value.
I know how to transform a String into a stream containing unique words (Split -> List -> stream() -> distinct())
, and I have translation service available, but what is the most convenient way to reduce the stream into Map
with the original element and it's translation in general?
You can directly do that via collect:
yourDistinctStringStream
.collect(Collectors.toMap(
Function.identity(), yourTranslatorService::translate
);
This returns a Map<String, String>
where the map key is the original string and the map value would be the translation.
Suppose you have a list of strings "word1", "word2", "wordN"
with no repetitions:
This should solve the the problem
List<String> list = Arrays.asList("word1", "word2", "workdN");
Map<String, String> collect = list.stream()
.collect(Collectors.toMap(s -> s, s -> translationService(s)));
This will return, the insertion order is not maintained.
{wordN=translationN, word2=translation2, word1=translation1}
Try the following code:
public static void main(String[] args) {
String text = "hello world java stream stream";
Map<String, String> result = new HashSet<String>(Arrays.asList(text.split(" "))).stream().collect(Collectors.toMap(word -> word, word -> translate(word)));
System.out.println(result);
}
private static String translate(String word) {
return "T-" + word;
}
Will give you output:
{java=T-java, world=T-world, stream=T-stream, hello=T-hello}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With