使用Java 8流创建和Collection <stream>

时间:2017-05-09 16:49:27

标签: java java-8 java-stream

我有一个班级

<?xml version="1.0"?>
<ruleset name="Blah">
    <description>Blah Coding Standards</description>
    <rule ref="Generic">
        <exclude name="Generic.Formatting.SpaceAfterCast.NoSpace"/>
        <exclude name="Generic.PHP.DeprecatedFunctions"/>
        <exclude name="Generic.PHP.DisallowShortOpenTag.EchoFound"/>
        <exclude name="Generic.PHP.UpperCaseConstant.Found"/>
    </rule>
</ruleset>

我想从给定名称的ColumnTag列表中获取columnSemanticTags。

相应的方法如下

class ColumnTags {
    String Name;
    Collection<String> columnSemanticTags;

    // constructor and getter and setters and other relevant attributes
}

想要将for循环转换为java流。我试过了

public Collection<String> getTags(String colName, List<ColumnTags> colList) 
{
   Collection<String> tags = new ArrayList();
   for(ColumnTag col:colList){
        if(colName.equals(col.getName())){
              tags = col.getColumnSemanticTags();
              break;
              }
     }
    return tags;
 }

我收到编译错误。我不知道供应商应该是什么。试过ArrayList :: new。我也尝试将它转换为ArrayList,但没有成功。 有人可以告诉我我假设错误或应该是什么应该是处理这种情况的预期方法。 通过该解决方案,有人可以解释为什么.collect()是解决此解决方案的错误方法。

3 个答案:

答案 0 :(得分:2)

public Collection<String> getTags(String colName, List<ColumnTags> colList) {
    return colList.stream().filter(col -> colName.equals(col.getName()))
        .map(col -> col.getColumnSemanticTags())
        .findFirst().orElse(new ArrayList<>());
}

答案 1 :(得分:2)

更简单的方法是简单地过滤Stream以找到您正在寻找的内容。如果找到,则返回,否则返回空ArrayList

return colList.stream()
              .filter(c -> colName.equals(c.getName()))
              .map(ColumnTag::getColumnSemanticTags)
              .findFirst()
              .orElseGet(ArrayList::new);

答案 2 :(得分:1)

如果您确实想使用collect,则必须致电flatMap。这会将所有列表(来自map(col -> col.getColumnSemanticTags()))合并到包含所有项目的单个流中。

 List<String> tags = colList.stream()
                .filter(col -> colName.equals(col.getName()))
                .map(col -> col.getColumnSemanticTags())
                .flatMap(collection -> collection.stream())
                .collect(Collectors.toList());