3 回答

TA貢獻1798條經(jīng)驗 獲得超3個贊
有沒有更好的方法而不是通過for循環(huán)遍歷所有項目?
值得注意的是,如果在到達列表末尾之前找到可接受的項目,您的代碼不會遍歷所有項目。但是,如果您只有要使用的列表,那么除了準(zhǔn)備檢查每個列表元素之外別無選擇。至于是否使用for循環(huán),我認為這很好。
或者我該如何使用流?如果是這樣,使用流是更好的方法嗎?
這些天使用流確實很流行,雖然它們的使用似乎比我認為的要多,但你的用例并不是不合理的。你可以這樣寫:
public GroupOfficeDto saveGroupOffice(GroupOfficeDto groupOfficeDto) {
List<GroupOffice> officesOfTheGroup = //some list from db..
Integer officeId = groupOfficeDto.getId();
String officeLabel = groupOfficeDto.getLabel();
return officesOfTheGroup.stream()
.filter(o -> !o.getId().equals(officeId))
.anyMatch(o -> o.getLabel().equals(officeLabel))
? groupOfficeDto : null;
}
這里特別相關(guān)的是.anyMatch()終端操作的使用,因為它允許流處理在結(jié)果確定后立即完成,就像你的for循環(huán)一樣,而不是處理整個流。另請注意,您正在比較辦公室的 ID 和標(biāo)簽被提取并存儲在流表達式之前的變量中。這允許它們“有效地最終”,這是它們出現(xiàn)在流中的 lambda 中所必需的。這樣做也稍微更有效率,而不是一遍又一遍地從 DTO 檢索相同的對象——對于for循環(huán)情況也是如此。
請注意,流版本并不比循環(huán)版本簡單得多,也不容易閱讀。我個人認為其中任何一個都沒有太多優(yōu)勢。

TA貢獻1810條經(jīng)驗 獲得超4個贊
嘗試這個:
public GroupOfficeDto saveGroupOffice(GroupOfficeDto groupOfficeDto) {
...
List<GroupOffice> result = officesOfTheGroup.stream()
.filter(it -> it.getLabel().equals(groupOfficeDto.getLabel()))
.filter(it -> !it.getId().equals(groupOfficeDto.getId()))
.collect(Collectors.toList())
...
}

TA貢獻1780條經(jīng)驗 獲得超4個贊
如果您需要布爾值,您可以執(zhí)行以下操作:
boolean b = officesOfTheGroup.stream() .anyMatch(office -> !office.getId().equals(5) && office.getLabel().equals("London"))
添加回答
舉報