亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 8 嵌套流 - 轉換鏈式 for 循環

Java 8 嵌套流 - 轉換鏈式 for 循環

嚕嚕噠 2021-12-22 18:53:18
我目前正在玩 Java 8 features 。我有以下一段代碼,并嘗試了多種使用Streams 的方法,但沒有成功。for (CheckBox checkBox : checkBoxList) {   for (String buttonFunction : buttonFunctionsList) {      if (checkBox.getId().equals(buttonFunction)) {          associatedCheckBoxList.add(checkBox);      }   }}我嘗試了以下操作,但我不確定這是否正確:checkBoxList.forEach(checkBox -> {     buttonFunctionsList.forEach(buttonFunction -> {     if (checkBox.getId().equals(buttonFunction))     associatedCheckBoxList.add(checkBox);     });     });
查看完整描述

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)


查看完整回答
反對 回復 2021-12-22
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

你應該更喜歡collectforEach當你的目標是要產生一些輸出Collection

List<CheckBox> associatedCheckBoxList =
    checkBoxList.stream()
                .filter(cb -> buttonFunctionsList.stream().anyMatch(bf -> cb.getId().equals(bf)))
                .collect(Collectors.toList());


查看完整回答
反對 回復 2021-12-22
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號