Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to reduce list to map with Java functional API

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?

like image 900
Tuomas Toivonen Avatar asked Apr 12 '17 08:04

Tuomas Toivonen


3 Answers

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.

like image 63
Gabe Avatar answered Nov 14 '22 15:11

Gabe


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}

like image 43
freedev Avatar answered Nov 14 '22 13:11

freedev


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}

like image 26
shizhz Avatar answered Nov 14 '22 15:11

shizhz