【问题标题】:Can I make a split and filter inside one single stream?我可以在一个流中进行拆分和过滤吗?
【发布时间】:2019-04-02 03:30:51
【问题描述】:

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

我有以下模式的字符串列表:

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]);
   } 
}

有什么想法吗?

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    在收集到列表之前,您可能正在寻找mapping:

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

    【讨论】:

    • 您还需要检查names[2] 是否有空白。您可以使用StringUtils#isNoneBlank一次检查所有内容。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 2012-02-10
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多