[英]Java List removing items without any action
我在使用 List 的 Java 代碼中遇到了一個奇怪的行為。
代碼非常簡單,我有一個名為AccessRequest
的 Object 列表,它來自數據庫,我正在使用第一個列表創建一個新列表,但過濾器為 select 只有幾個對象。
這是代碼:
private void updateCommentIfNeeded() {
List<AccessRequest> accessRequestList = getAllRequest();
List<AccessRequest> commentsList = getCommentsListProcessedManually(accessRequestList);
}
public List<AccessRequest> getCommentsListProcessedManually(List<AccessRequest> accessRequests) {
accessRequests.removeIf(ar -> !ar.getComment().equals("To be processed manually"));
if (accessRequests.size() != 0) {
SQLServerConnection sqlServerConnection = new SQLServerConnection(sqlServerUrl);
accessRequests.removeIf(ar -> !sqlServerConnection.emailExists(ar.getEmail()));
}
return accessRequests;
}
我應該得到第二個列表,其中僅包含對其注釋為To be processed manually
的對象,我這樣做了。 但奇怪的是,第一個 List 也采用第二個的值,就好像我寫了accessRequestList = commentsList
但沒有這樣的東西,我使用的是局部變量。
前任:
如果有人有想法,我有點迷路了!
您的方法getCommentsListProcessedManually
修改您傳遞的列表。 我相信您的操作是假設將列表作為參數傳遞會以某種方式創建列表的副本,而實際發生的是對列表的引用是按值傳遞的。
有幾種方法可以解決這個問題,但最簡單的方法是在方法開始時簡單地創建輸入列表的副本:
public List<AccessRequest> getCommentsListProcessedManually(List<AccessRequest> input) {
List<AccessRequest> accessRequests = new ArrayList<>(input);
accessRequests.removeIf(ar -> !ar.getComment().equals("To be processed manually"));
if (accessRequests.size() != 0) {
SQLServerConnection sqlServerConnection = new SQLServerConnection(sqlServerUrl);
accessRequests.removeIf(ar -> !sqlServerConnection.emailExists(ar.getEmail()));
}
return accessRequests;
}
您也可以為此使用 Stream API(使用filter
操作),但在這種情況下這有點棘手。
您正在將列表的引用傳遞給方法 getCommentsListProcessedManually。
因此 accessRequestList 和作為參數傳遞的那個是相同的,因此對列表進行的任何操作都是對同一個列表進行的。
您可以在將列表作為參數傳遞之前創建列表的副本:
List<AccessRequest> newList = new ArrayList<AccessRequest>(accessRequestList);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.