我需要使用Key和List迭代Map以提供另一种类型的对象。我试图在代码级别进行解释。
我尝试了for循环,效果很好。但是我喜欢Java8流式传输
public Map<String, List<TestClassResult>> getComputed(
Map<String, SourceClass[]> sourceMapObject) {
Map<String, List<TestClassResult>> response = new HashMap<>();
// Here goes the functionality
List<TestClassResult> result;
for (Map.Entry<String, SourceClass[]> entry : sourceMapObject.entrySet()) {
result = new ArrayList<>();
String key = entry.getKey();
for (SourceClass value : entry.getValue()) {
result.add(someMethod(value.id, value.empCode));
}
response.put(key, result);
}
return response;
}
public class SourceClass{
private String id;
private String empCode;
}
public class TestClassResult{
private String empName;
private String empMartial;
private int empAge;
}
我需要使用Java 8流和lambda来实现
答案 0 :(得分:3)
sourceMapObject.entrySet()
.stream()
.collect(Collectors.toMap(
Entry::getKey,
entry -> Arrays.stream(entry.getValue())
.map(value -> someMethod(value.id, value.empCode))
.collect(Collectors.toList()),
(left, right) -> right
))
如果您确定不会重复,则可以省略(left, right) -> right
部分。但是,由于在您现有的代码中,您拥有response.put(key, result);
,因此我将其保留为与该代码保持一致。
这里的要点是Map::put
将覆盖您在Map
中已经拥有的先前值,而Collectors::toMap
不的合并将抛出一个例外。另一方面,对于(left, right) -> right
,它的行为就像put
。