我有以下问题:
目标:从列表中删除“危险”== 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;
}
}
您的代码有两个主要问题:
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);
}