2 回答

TA貢獻1828條經驗 獲得超4個贊
Eran 的回答可能不錯;但由于buttonFunctionList是(大概)一個列表,它有可能包含重復的元素,這意味著原始代碼會多次將復選框添加到關聯列表中。
所以這是另一種方法:您將復選框添加到列表中的次數與該項目的 id 在另一個列表中出現的次數相同。
因此,您可以將內部循環編寫為:
int n = Collections.frequency(buttonFunctionList, checkBox.getId();
associatedCheckboxList.addAll(Collections.nCopies(checkBox, n);
因此,您可以將其寫為:
List<CheckBox> associatedCheckBoxList =
checkBoxList.flatMap(cb -> nCopies(cb, frequency(buttonFunctionList, cb.getId())).stream())
.collect(toList());
(為簡潔起見,使用靜態導入)
如果任一checkBoxList或者buttonFunctionList是大的,你可能要考慮計算頻率一次:
Map<String, Long> frequencies = buttonFunctionList.stream().collect(groupingBy(k -> k, counting());
然后你可以在 lambda 中使用 this 作為n參數nCopies:
(int) frequencies.getOrDefault(cb.getId(), 0L)

TA貢獻1845條經驗 獲得超8個贊
你應該更喜歡collect
在forEach
當你的目標是要產生一些輸出Collection
:
List<CheckBox> associatedCheckBoxList = checkBoxList.stream() .filter(cb -> buttonFunctionsList.stream().anyMatch(bf -> cb.getId().equals(bf))) .collect(Collectors.toList());
添加回答
舉報