使用Stream API将List <string>聚合到HashMap <string,t =“”>中

时间:2017-08-22 20:05:01

标签: java java-stream aggregation reduce collect

我有一个@Component(...) export class MyComponent implements OnInit { results: string[]; // Inject HttpClient into your component or service. constructor(private http: HttpClient) {} ngOnInit(): void { // Make the HTTP request: this.http.get('/api/items').subscribe(data => { // Read the result field from the JSON response. this.results = data['results']; }); } } 和一个字符串列表,我希望看到这些字符串中的哪一个是MultivaluedMap中的键。对于MultivaluedMap中键的每个字符串,我想从该键的值中构造一个新的MultivaluedMap,将该字符串设置为新Thing中的新键,并将我创建的新HashMap<String, Thing>设置为Thing中新密钥的值。

现在,使用香草HashMap,我有以下工作解决方案:

forEach

但是,我想使用Java Stream API实现此功能解决方案,并尝试了一些解决方案。我有以下,看起来它应该工作,但它没有:

MultivaluedMap<String, String> params = uriInfo.getQueryParameters();
HashMap<String, Thing> result = new HashMap<String, Thing>();

listOfStrings.forEach( (key) -> {
    String value = params.getFirst(key);
    if (value != null && !value.isEmpty()) {
        result.put(key, new Thing(value));
    }
});

MultivaluedMap<String, String> params = uriInfo.getQueryParameters(); HashMap<String, Thing> result = listOfStrings .stream() .filter(params::containsKey) .map( e -> new AbstractMap.SimpleEntry<String, Thing>(e, new Thing(params.getFirst(e)))) .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); Entry::getKey正在提供“非静态方法无法从静态上下文引用”。我尝试过其他变体:在Entry::getValuekeyMapper lambdas中构造对象,并使用reduce和空映射作为初始值。没有人工作过。

如何使用Java Stream API和聚合(例如valueMappercollect)重写我的第一个工作解决方案?我引用了this帖子和this帖子和this帖子。

1 个答案:

答案 0 :(得分:2)

你的代码很好。您只需将返回类型更改为Map而不是HashMap。如果您需要专门HashMap,则可以将HashMap::new传递到factory overload

我做的一个改进是删除不必要的map()操作并在收集器中进行查找:

Map<String, Thing> result = listOfStrings
        .stream()
        .filter(params::containsKey)
        .collect(Collectors.toMap(Function.identity(), k -> new Thing(params.getFirst(k))));