簡體   English   中英

java 8 檢查重復項,然后才添加到 ArrayList

[英]java 8 Check for duplicates and only then add to an ArrayList

我在下面創建了一個測試 class。 我的主要目標是僅當對象的某些參數(在本例中為 name )不匹配時才將 object 添加到給定列表。

import java.util.ArrayList;
import java.util.List;

public class SmartAuto {
static Car car1 = new Car(1, "Lexus");
static Car car2 = new Car(2, "Tesla");
static Car car3 = new Car(3, "Lexus");

public static void main(String[] args) {
    List<Car> cars = new ArrayList<Car>();
    addNewCar(cars, car1);
    addNewCar(cars, car2);
    addNewCar(cars, car3);
    
    System.out.println(cars.size());
}

private static List<Car> addNewCar(List<Car> cars, Car car) {
    if (cars.size() == 0) {
        cars.add(car);
        return cars;
    }
    cars.forEach(c -> {
        if(c.name == car.name) {
            System.out.println("Can't add as car names are duplicate");
            return;
        } else {
            cars.add(car);
            return;
        }
    });
    
    return cars;
}

public static class Car {
    int id;
    String name;
    
    Car (int id,String name) {
        this.id = id;
        this.name = name;
    }
}

我的問題是這是失敗的,但我不明白以下異常:

Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList.forEach(ArrayList.java:1542)
at Sample/main.SmartAuto.addNewCar(SmartAuto.java:25)
at Sample/main.SmartAuto.main(SmartAuto.java:14)

另外,我需要知道在 java 8 中是否可以用更好的方式編寫此代碼?

  1. 添加檢查是否存在; 不要在forEach循環內添加(這會導致異常)。
  2. 使用.equals來比較String對象,而不是==
  3. 您可以使用Stream#noneMatch來檢查條件。 (為了獲得更好的性能,請考慮存儲一Set已經在List中的名稱。)
if (cars.stream().noneMatch(c -> c.name.equals(car.name))) cars.add(car);
else System.out.println("Can't add as car names are duplicate");
return cars;

您不應該修改 Stream 的forEach中的源列表。

如果操作執行修改元素的基礎源的副作用,則此方法的行為是未指定的,除非覆蓋 class 已指定並發修改策略。

更改您的addNewCar方法以首先通過循環到列表末尾或在存在時退出來確定是否存在重復項,然后添加到列表中。 順便說一句,您可以通過將集合更改為Set並將Car object哈希碼定義為與名稱字段哈希碼相同並添加到HashSet ,然后自動存儲唯一汽車來實現此目的。
但是,將答案限制在您的代碼片段中的快速修復,對addNewCar的以下更改應該可以解決該問題。

private static List<Car> addNewCar(List<Car> cars, Car car) {
    if (cars.size() == 0) {
        cars.add(car);
        return cars;
    }

    boolean duplicate = false;
    for (Car c : cars) {
        if (c.name == car.name) {
            System.out.println("Can't add as car names are duplicate");
            duplicate = true;
            break;
        }
    }
    if (!duplicate) {
        cars.add(car);
    }

    return cars;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM