我已经将常规的for循环代码转换为java 8流。我尝试了一些,但是我仍然在学习并且用尽了所有想法,请提出想法。可以进一步简化吗?除了使用forEach之外,我无法进行太多更改。 另外,为什么我必须在getERecordFromId((String)eid)中将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());
}
}
答案 0 :(得分:6)
因为您使用原始的Stream
变量,所以必须进行强制转换。假设getEidStream()
返回一个Stream<String>
,您应该已经将其分配给Stream<String>
变量,或者根本没有将其分配给变量。
首先使用forEach
会破坏使用Stream
的目的。
您应该使用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());