Java Stream .map троичный оператор - PullRequest
1 голос
/ 05 октября 2019

У меня есть TXT.File с линиями, которые представляют некоторые объекты

R-линия (одна)

RN-линия (1 ... много)

они связаны с идентификатором, поэтому для чтения файла я сделал lines().stream

Stream<Boolean> inLines = in.lines()
         //limit lines due to memory footprint
        .limit(10)
         //filter each line by the given id
        .filter(identN -> ident.matches(".*\\t[5]\\t.*"))
        /**
         * should return all lines with id 5
         * if line starts with RN put it in rnArray else in rArray so the objects are connected but i need for validation purposes each line seperate??
         */
        .map(y -> (y.startsWith("RN") ? synonym1.add(y) : substance.add(y)));


System.out.println("syn1 = " + synonym1.toString() + "substance: = " + substance + " InLines"+ inLines);

Ответ пустой:

syn1 = []substance: = [] InLinesjava.util.stream.ReferencePipeline$3@3aa9e816

Но это не такт работа. Возвращение .map должно быть другим потоком, так как я могу включить эту логику, если я использую для каждого, она не будет работать, так как мне также нужна r-Line.

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Причина

Ответ пуст, поскольку нет операции терминала , вызванной на Stream, который вы создали (inLines). Следовательно, и synonym1, и substance остаются пустыми, когда вы пытаетесь получить к ним доступ во время печати на консоль.

Альтернативный

То, что вы можете просто искать, это заменить окончательный map работа с forEach, так как она сохранит типы найденных элементов synonym1 и substance, что, по-видимому, является вашим основным вариантом использования. Это можно сделать следующим образом:

.forEach(y -> {
    if (y.startsWith("RN")) {
        synonym1.add(y);
    } else {
        substance.add(y);
    }
});

Примечание

В настоящее время нет смысла собирать Stream<Boolean> в Collection, поскольку это будет включать в себя результатОперация .add для коллекций synonym1 и substance для каждого фильтруемого элемента.

0 голосов
/ 05 октября 2019

Спасибо @Naman, это мне очень помогло, так как я нашел способ, который позволяет мне тоже использовать троичный оператор и разделить поток на 2 отдельных Списка, сгруппировав

 .forEach((x) -> ((x.startsWith("RN"))?synonym:substance).add(x));

, поэтому проблема в том, чтоОператор x не был в скобках, я думаю, это потому, что группировка объектов или есть какие-либо другие объяснения

Спасибо

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