我是Java 8和Streams的新手。 我有一个PolicyDefinition对象,它有两个方法:getAlias,getName都返回一个字符串。 是否有一种优雅的方法可以在一个语句中使用Stream(从PolicyDefinition集合创建)创建包含所有别名和策略定义名称的列表?
有两个陈述不是问题:
List<String> policyNames =
policyDefinitions.stream()
.map(definition -> definition.getName())
.collect(Collectors.toList());
List<String> policyAlias =
policyDefinitions.stream()
.map(definition -> definition.getAlias())
.collect(Collectors.toList());
但有可能在一个吗?
非常感谢您的帮助
答案 0 :(得分:4)
flatMap
它!
List<String> policyNames = policyDefinitions.stream()
.flatMap(definition -> Stream.of(definition.getName(), definition.getAlias()))
.collect(Collectors.toList());
正如the comments中所述 - 为了整洁,请在Definition
public Stream<String> allNames() {
return Stream.of(getName(), getAlias())
}
然后
List<String> policyNames = policyDefinitions.stream()
.flatMap(Definition::allNames)
.collect(Collectors.toList());
OP comments&#34; 我忘了提及getAlias
可能是null
,你做的比 [原文如此]&#34; < / p>
在这种情况下,请使用Optional
:
public Stream<String> allNames() {
return Stream.concat(Stream.of(getName()), Optional.ofNullable(getAlias()).stream())
}
答案 1 :(得分:0)
您还可以使用groupingBuy运算符创建一个带别名的地图作为键,名称作为值