我可以在单个流中进行拆分和过滤吗?

时间:2019-04-02 03:30:51

标签: java java-stream

我正在尝试执行以下操作。...

我在以下模式下有一个字符串列表:

John,Peter,Carl
Rose,Joanne,Natalie

此刻我正在逐行阅读并输出流...

赞:

 Files.lines(myfile).toURI()))

这将返回一个流。

我知道我可以将它们收集到一个列表中,但是我想知道是否可以在此流中拆分并执行更多逻辑?

如果三个预期字段中的任何一个为空,我会尝试将每一行拆分并过滤,这有可能吗?

此刻,我以这种“旧方式”拥有它:

List<TripleNames> validValues = new ArrayList();
for(String value:values) { //values represent each line comma separated
   final String[] names = line.split(",");
   if (StringUtils.isNotBlank(names[0]) && StringUtils.isNotBlank(names[1]).... {
    validValues.add(new TripleNames(names[0], names[1], names[2]);
   } 
}

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

在以以下方式收集到列表之前,您可能正在寻找map ping:

List<TripleNames> validValues = values.stream()
        .map(line -> line.split(","))
        .filter(names -> StringUtils.isNotBlank(names[0]) && StringUtils.isNotBlank(names[1]))
        .map(names -> new TripleNames(names[0], names[1], names[2]))
        .collect(Collectors.toList());

答案 1 :(得分:0)

如果您想要一种简单的方法来检查所有拆分项目,则可以使用:

Arrays.stream(names).allMatch(StringUtils::isNotBlank)

代替在条件中分别检查每个项目。

这是完整的示例:

List<String> validValues = values.stream()
    .map(line -> line.split(","))
    .filter(names -> Arrays.stream(names).allMatch(StringUtils::isNotBlank))
    .map(names -> new TripleNames(names[0], names[1], names[2]))
    .collect(Collectors.toList());

如果有帮助,您也可以在.map(String::trim)之前使用.allMatch()来剪切所有名称的开头和结尾的空格。

相关问题