使用过滤器将Java for循环转换为流

Rom*_*oma 1 java lambda java-stream

我已经将常规的for循环代码转换为java 8流。我尝试了一些,但是我仍然在学习并且用尽了所有想法,请提出想法。可以进一步简化吗?除了使用forEach之外,我无法进行太多更改。另外,为什么我必须将eid转换为getERecordFromId((String)eid)中的String

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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 6

由于您使用原始Stream变量,因此必须进行强制转换。假设getEidStream()返回a 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());
Run Code Online (Sandbox Code Playgroud)