【问题标题】:How to reduce list to map with Java functional API如何使用 Java 功能 API 减少列表以映射
【发布时间】:2017-09-07 22:00:03
【问题描述】:
我想将一串文本转换为字典,其中包含所有唯一个单词作为键,翻译作为值。
我知道如何将字符串转换为包含唯一单词(Split -> List -> stream() -> distinct()) 的流,并且我有翻译服务可用,但是将流减少为Map 的最方便的方法是原始元素和它的一般翻译?
【问题讨论】:
标签:
java
functional-programming
java-8
java-stream
【解决方案1】:
假设您有一个字符串列表 "word1", "word2", "wordN" 没有重复:
这应该可以解决问题
List<String> list = Arrays.asList("word1", "word2", "workdN");
Map<String, String> collect = list.stream()
.collect(Collectors.toMap(s -> s, s -> translationService(s)));
这会返回,不维护插入顺序。
{wordN=translationN, word2=translation2, word1=translation1}
【解决方案2】:
试试下面的代码:
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;
}
会给你输出:
{java=T-java, world=T-world, stream=T-stream, hello=T-hello}
【解决方案3】:
您可以通过 collect 直接执行此操作:
yourDistinctStringStream
.collect(Collectors.toMap(
Function.identity(), yourTranslatorService::translate
);
这将返回一个Map<String, String>,其中映射键是原始字符串,映射值是翻译。