当我尝试使用 BiCionsumer 从我的列表中删除一个值时,它不起作用

问题描述 投票:0回答:2

我有以下问题:

目标:从列表中删除“危险”== true 的动物;

约束:必须使用其中一个函数接口(Consumer、Predicate、Function或Supplier)(我选择BiConsumer是因为索引);

问题:BiConsumer 没有更新传递的列表(没有显示错误);

尝试:我也试过在“removeDangerousAnimal”中有一个列表,这样我就可以做类似的事情:

static List<Animal> removeDangerousAnimal(List<Animal> listOfAnimals){
        List<Animal> newList = new Arraylist<>();
 
        BiConsumer<Boolean, Integer> removeDangerous = (isDangerous, index) -> {
            if(isDangerous == true){
                System.out.println("Dangerous animal: " + listOfAnimals.get(index).getName());
                listOfAnimals.remove(index);
                newList = listOfAnimals;
            }
        };

但我了解到 lambda 局部变量是不可变的(错误:“在 lambda 表达式中使用的变量应该是最终的或有效的最终的”)。

问题:我不明白为什么 BiConsumer 不更新我的列表。你能帮忙吗?

主要:

public class Main {
    public static void main(String[] args) {
        List<Animal> animals = new ArrayList<>();

        Dog dog = new Dog("Tom", "He's a good boy", "Chihuahua", 10, 0.30, false, "Dry food", 0.20);
        Cat cat = new Cat("Misty", "She has a temper!", "Tigress", 6, 0.40, true, "Soggy food", 0.5);
        Bird bird = new Bird("Twitty", "He's very cute!", "Parrot", 1.5, 0.15, false, "Dry food", 0.10);

        animals.add(dog);
        animals.add(cat);
        animals.add(bird);

        animals = removeDangerousAnimal(animals);

        for (Animal a: animals) {
            System.out.println("Animal name: " + a.getName());
        }
    }

    static List<Animal> removeDangerousAnimal(List<Animal> listOfAnimals){

        BiConsumer<Boolean, Integer> removeDangerous = (isDangerous, index) -> {
            if(isDangerous == true){
                System.out.println("Dangerous animal: " + listOfAnimals.get(index).getName());
                listOfAnimals.remove(index);
            }
        };

        for (int i = 0; i < listOfAnimals.size(); i++) {
            //System.out.println("Animal name: " + a.getName() + " " + a.isDanger());
            removeDangerous.accept(listOfAnimals.get(i).isDanger(), i);
        }

        return listOfAnimals;
    }
}

动物:

public class Animal {

    private String name;
    private String description;
    private String race;
    private double weight;
    private double height;
    private boolean danger;
    private String food;
    private double foodQuantity;

    //---------------------------


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getRace() {
        return race;
    }

    public void setRace(String race) {
        this.race = race;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public boolean isDanger() {
        return danger;
    }

    public void setDanger(boolean danger) {
        this.danger = danger;
    }

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    public double getFoodQuantity() {
        return foodQuantity;
    }

    public void setFoodQuantity(double foodQuantity) {
        this.foodQuantity = foodQuantity;
    }
}

狗:

public class Dog extends Animal {
    private String name;
    private String description;
    private String race;
    private double weight;
    private double height;
    private boolean danger;
    private String food;
    private double foodQuantity;

    //---------------------------

    public Dog(String name, String description, String race, double weight, double height, boolean danger, String food, double foodQuantity) {
        this.name = name;
        this.description = description;
        this.race = race;
        this.weight = weight;
        this.height = height;
        this.danger = danger;
        this.food = food;
        this.foodQuantity = foodQuantity;
    }

    public Dog(){

    }
    //---------------------------

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getRace() {
        return race;
    }

    public void setRace(String race) {
        this.race = race;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public boolean isDanger() {
        return danger;
    }

    public void setDanger(boolean danger) {
        this.danger = danger;
    }

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    public double getFoodQuantity() {
        return foodQuantity;
    }

    public void setFoodQuantity(double foodQuantity) {
        this.foodQuantity = foodQuantity;
    }
}

猫:

public class Cat extends Animal {

    private String name;
    private String description;
    private String race;
    private double weight;
    private double height;
    private boolean danger;
    private String food;
    private double foodQuantity;

    //---------------------------

    public Cat(String name, String description, String race, double weight, double height, boolean danger, String food, double foodQuantity) {
        this.name = name;
        this.description = description;
        this.race = race;
        this.weight = weight;
        this.height = height;
        this.danger = danger;
        this.food = food;
        this.foodQuantity = foodQuantity;
    }

    public Cat(){

    }

    //---------------------------

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getRace() {
        return race;
    }

    public void setRace(String race) {
        this.race = race;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public boolean isDanger() {
        return danger;
    }

    public void setDanger(boolean danger) {
        this.danger = danger;
    }

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    public double getFoodQuantity() {
        return foodQuantity;
    }

    public void setFoodQuantity(double foodQuantity) {
        this.foodQuantity = foodQuantity;
    }
}

鸟:

public class Bird extends Animal {

    private String name;
    private String description;
    private String race;
    private double weight;
    private double height;
    private boolean danger;
    private String food;
    private double foodQuantity;

    //---------------------------

    public Bird(String name, String description, String race, double weight, double height, boolean danger, String food, double foodQuantity) {
        this.name = name;
        this.description = description;
        this.race = race;
        this.weight = weight;
        this.height = height;
        this.danger = danger;
        this.food = food;
        this.foodQuantity = foodQuantity;
    }

    public Bird(){

    }

    //---------------------------

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getRace() {
        return race;
    }

    public void setRace(String race) {
        this.race = race;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public boolean isDanger() {
        return danger;
    }

    public void setDanger(boolean danger) {
        this.danger = danger;
    }

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    public double getFoodQuantity() {
        return foodQuantity;
    }

    public void setFoodQuantity(double foodQuantity) {
        this.foodQuantity = foodQuantity;
    }
}
java consumer functional-interface
2个回答
0
投票

这可能遗漏了问题的重点,但您可以使用

removeIf
并传递基于
Predicate
属性的
isDanger

animals.removeIf(Animal::isDanger)

0
投票

您的代码有两个主要问题:

  • 当您将
    Integer
    传递给
    List#remove
    时,它正在使用按值删除元素的重载(请参阅
    List#remove(Object)
    )。您需要传递
    int
    而不是通过 index 删除。
  • 为了在迭代时删除元素,避免跳过元素,您应该向后循环或使用
    Iterator
    .
BiConsumer<Boolean, Integer> removeDangerous = (isDangerous, index) -> {
    if(isDangerous){
        System.out.println("Dangerous animal: " + listOfAnimals.get(index).getName());
        listOfAnimals.remove((int)index);
    }
};
for (int i = listOfAnimals.size() - 1; i >= 0; i--) {
    removeDangerous.accept(listOfAnimals.get(i).isDanger(), i);
}
© www.soinside.com 2019 - 2024. All rights reserved.