конвертировать Java для цикла в поток с фильтром - PullRequest
1 голос
/ 24 мая 2019

Я преобразовал обычный код цикла в потоки Java 8. Я попробовал несколько, но я все еще изучаю это и у меня заканчиваются идеи, пожалуйста, предложите идеи. это может быть еще больше упрощено? Кроме использования forEach, я не могу многое изменить. Кроме того, почему я должен типизировать eid к String в getERecordFromId ((String) eid)

Stream <String>eIdsStream = getEidStream();

final HashSet<String> declinedRecords = new HashSet<>();

eIdsStream.forEach (eid ->  {
        ERecord eRecord = getERecordFromId((String)eid);
        if(eRecord.getEHash() != null &&  Status.DECLINED == eRecord.getStatus()) {
            declineRecords.add(eRecord.getEHash());
        }
    }

1 Ответ

6 голосов
/ 24 мая 2019

Приведение требуется, так как вы используете необработанную переменную Stream.Предполагая, что getEidStream() возвращает Stream<String>, вы должны были присвоить его переменной Stream<String> или вообще не назначать ее переменной.

Использование forEach отрицает цель использования Streams в первую очередь.

Вы должны использовать filter и map, чтобы преобразовать Stream для хранения необходимых элементов, а затем собрать в Set.

Set<String> declinedRecords =
    getEidStream().map(eid -> getERecordFromId(eid))
                  .filter(eRecord -> eRecord.getEHash() != null &&  Status.DECLINED == eRecord.getStatus())
                  .map(ERecord::getEHash)
                  .collect(Collectors.toSet());
...