从字符串映射到多个不同的字符串,并使用Java流添加到列表中

时间:2018-04-02 11:12:02

标签: java-8 java-stream

我是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());

但有可能在一个吗?

非常感谢您的帮助

2 个答案:

答案 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运算符创建一个带别名的地图作为键,名称作为值