我有一个列表要使用属性进行分组。我不知道为什么我会得到一个错误
类型不匹配:无法从映射转换<对象,列表>映射<字符串,列表<MyClass.Leader>gt;
调用Leader类时。我正在使用Java 8。
Map<String, List<Leader>> reports = vals.stream()
.collect(
Collectors.mapping(val -> val.split("\|"),
Collectors.mapping(leaderArgs -> new Reports(leaderArgs[0], leaderArgs[1], leaderArgs[2], leaderArgs[3]),
Collectors.groupingBy(leader -> leader.country))));
```java
public class Leader {
String name;
String country;
String age;
String sex;
Leader(String name, String country, String age, String sex) {
this.name = name;
this.country = country;
this.age = age;
this.sex = sex;
}
}
下面的代码与您的代码做相同的事情,但将采集分成多个映射步骤,这可能对您更有效:
Pattern splitPattern = Pattern.compile("\|");
Map<String, List<Leader>> result =
vals.stream()
.map(splitPattern::split)
.map(leaderArgs -> new Leader(leaderArgs[0], leaderArgs[1], leaderArgs[2], leaderArgs[3]))
.collect(Collectors.groupingBy(leader -> leader.country));
我还使用了Pattern
,它将比重复调用String.split.快一点
简单的XML输出可能是:
result.entrySet()
.forEach(entry -> {
System.out.println("<LeaderList country="" + entry.getKey() + "">");
entry.getValue()
.forEach(leader -> System.out.println("<Leader name="" + leader.name + "" age="" + leader.age + "" sex="" + leader.sex + "">"));
System.out.println("</LeaderList>");
});
收集代码假设输入vals
是一个字符串流,每行有一个条目。例如读取文件:
Path path = ... file path
try (Stream<String> vals = Files.lines(path))
{
... the collect code
}
catch (final IOException ex)
{
// TODO error handling
}
注意:使用带有Files.lines
的try-with-resources块非常重要,这样流才能正确关闭。