Могу ли я сделать разделение и отфильтровать внутри одного потока? - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь сделать следующее ....

У меня есть список строк в следующем режиме:

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 ]

2 голосов
/ 02 апреля 2019

Возможно, вы ищете 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());
0 голосов
/ 02 апреля 2019

Если вы хотите простой способ проверить все разделенные элементы, вы можете использовать:

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(), чтобы вырезать пробелы в начале и конце всех имен, если это помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...