我有一个@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::getValue
和keyMapper
lambdas中构造对象,并使用reduce和空映射作为初始值。没有人工作过。
如何使用Java Stream API和聚合(例如valueMapper
,collect
)重写我的第一个工作解决方案?我引用了this帖子和this帖子和this帖子。
答案 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))));