使用流API或Lambda从管道分隔的字符串中过滤特定的列

时间:2019-12-01 13:27:31

标签: java lambda java-8 java-stream filtering

假设我有一个字符串/对象,其中某些数据采用管道分隔格式,如下所示

***Input:***
TIMESTAMP|COUNTRYCODE|RESPONSETIME|FLAG
1544190995|US|500|Y
1723922044|GB|370|N
1711557214|US|750|Y

我想读取此字符串/对象并根据特定的列名过滤数据(假设为TIMESTAMP和FLAG)。 并返回/显示输出,如下所示-

***Output:***
TIMESTAMP|FLAG
1544190995|Y
1723922044|N
1711557214|Y

我尝试使用以下代码:

  1. 首先,我需要将标头名称存储在数组中:

    headerArray[] = {TIMESTAMP, FLAG}
    
  2. 通过将headerArray[]与输入的第一行进行比较,我得到了输入中指定列标题的索引:

    headerIndex[] = {0, 3}
    
  3. 然后尝试使用以下代码过滤并获取指定的列和值:

    return br.lines()
            .skip(1) // skip headers
            .map(s -> s.split("|"))
            .filter(a -> a[0] && a[3])
            .collect(Collectors.toList());
    

注意:我有超过一百万行的管道分隔值。我想在单个对象中返回所有过滤出的列值。我想通过返回值作为列表是不可能的。

1 个答案:

答案 0 :(得分:2)

您遇到一些问题:

首先,您应该将split的模式更改为\\|,并且可以map代替过滤器来创建新字符串。

 br.lines().skip(1) // skip headers
            .map(s -> s.split("\\|"))
            .map(a -> String.join("|", a[0], a[3]))
            .collect(toList())