如何删除或更新ObservableList中的某些行

时间:2017-07-19 07:42:16

标签: java javafx javafx-2

我遇到一个问题,即使用单个元素检测并删除和更新列表中的某些行。 如果我只知道单个元素" Corn",如何从此列表中删除它。

如果我想更新价格为1.49到2.49的所有产品,还要怎么做。

    ObservableList<Product> products = FXCollections.observableArrayList();
    products.add(new Product("Laptop", 859.00, 20));
    products.add(new Product("Bouncy Ball", 2.49, 198));
    products.add(new Product("Toilet", 9.99, 74));
    products.add(new Product("The Notebook DVD", 19.99, 12));
    products.add(new Product("Corn", 1.49, 856));
    products.add(new Product("Chips", 1.49, 100));

    if (products.contains("Corn")){  
        System.out.println("True");
    }
    else System.out.println("False");


class Product {
    Product(String name, Double price, Integer quantity) {
        this.name = name;
        this.price = price;
        this.quantity = quantity;
    }
    private String name;
    private Double price;
    private Integer quantity;
}

由于

2 个答案:

答案 0 :(得分:4)

您可以使用Java 8的功能类型来获得简洁易读的代码:

products.removeIf(product -> product.name.equals("Corn"));

products.forEach(product -> {
        if (product.price == 1.49) product.price = 2.49;
});

如果要检索具有特定条件的所有产品,请执行以下操作:

products.stream().filter(product -> /* some condition */).collect(Collectors.toList());

此外,您可以简单地使用普通Iterator

for (Iterator<Product> i = products.iterator(); i.hasNext();) {
    Product product = i.next();
    if (product.name.equals("Corn")) i.remove();
    else if (product.price == 1.49) product.price = 2.49;
}

根据 Effective Java ,尽可能地限制变量的范围 - 避免在循环之外声明迭代器。

你不能在这里使用for-each循环,因为在for-each循环中删除将导致ConcurrentModificationException

答案 1 :(得分:1)

只需使用普通Iterator即可。您还需要创建getters and setters

for (Iterator i = products.iterator(); i.hasNext();)
    Product p = i.next();

    if (p.getName().equals("Corn")) {
        i.remove();
    } else if (p.getPrice() == 1.49) {
        p.setPrice(2.49);
    }
}