Quiero transformar una cadena de texto en un diccionario, que contiene todas las palabras únicas como clave y la traducción como valor.
Sé cómo transformar un String en un flujo que contiene palabras únicas (Split -> List -> stream() -> distinct()) , y tengo un servicio de traducción disponible, pero ¿cuál es la forma más conveniente de reducir el flujo en Map ? con el elemento original y su traducción en general?
Puede hacerlo directamente a través de recopilar:
yourDistinctStringStream .collect(Collectors.toMap( Function.identity(), yourTranslatorService::translate ); Esto devuelve Map<String, String> donde la clave del mapa es la cadena original y el valor del mapa sería la traducción.
Suponga que tiene una lista de cadenas "word1", "word2", "wordN" sin repeticiones:
Esto debería resolver el problema.
List<String> list = Arrays.asList("word1", "word2", "workdN"); Map<String, String> collect = list.stream() .collect(Collectors.toMap(s -> s, s -> translationService(s)));Esto devolverá, la orden de inserción no se mantiene.
{palabraN=traducciónN, palabra2=traducción2, palabra1=traducción1}
Prueba el siguiente código:
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; }Le dará salida:
{java=T-java, mundo=T-mundo, stream=T-stream, hola=T-hola}