Как удалить объект из моего потока - PullRequest
0 голосов
/ 11 июля 2020

У меня есть x количество объектов, хранящихся в моем потоке, и пользователь может искать объект, который он хотел бы удалить. После поиска я печатаю объект и его элементы на экране и спрашиваю, является ли это объектом, который они хотели бы удалить, запрашивая подтверждение да / нет. После подтверждения объект должен быть удален, а поток элементов должен быть напечатан снова, за исключением элемента, который был только что удален (ну, он был удален, лол). Я столкнулся с проблемой, когда мой код просто перестает работать и ничего не печатает после подтверждения пользователем, я не уверен, почему. Я использую removeIf, так как это было рекомендовано при исследовании.

Основной класс

else if (choice == 3){
            System.out.println("\nEnter the name of the movie you would like to delete (Case Sensitive): ");
            String search = scan.nextLine();

            Optional<Item> optionalItemToRemove = items.stream()
                    .map(x->{
                        if(x.getItems()==null){
                            return Collections.singletonList(x);
                        }
                        x.getItems().getItem().add(x);
                        return x.getItems().getItem();
                    })
                    .flatMap(Collection::stream)
                    .filter(x -> x.getName().equals(search))
                    .peek(x-> x.setItems(null))//Peek exists mainly to support debugging
                    .findFirst();
            System.out.println(optionalItemToRemove.toString());

            System.out.println("Confirm Deletion? (Y/N)");
            String confirm = scan.nextLine();

            if (confirm.equalsIgnoreCase("y")){
            if (optionalItemToRemove.isPresent()) {
                items.removeIf(itemToCheck -> itemToCheck.equals(optionalItemToRemove));

                System.out.println(items);
           }
            else return;
        }
        else return;

Класс предметов

import javax.xml.bind.annotation.XmlElement;

public class Item {

        private String dataType;
        private String name;
        private int data;
        private String group;
        private Items items;
    
        @XmlElement
        public String getDataType(){
            return dataType;
        }
        public void setDataType(String dataType){
            this.dataType = dataType;
        }
    
        @XmlElement
        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name = name;
        }
    
        @XmlElement
        public int getData(){
            return data;
        }
        public void setData(int data){
            this.data = data;
        }
    
        @XmlElement
        public String getGroup(){
            return group;
        }
        public void setGroup(String group){
            this.group = group;
        }
    
        public Items getItems() {
            return items;
        }
    
        public void setItems(Items items) {
            this.items = items;
        }
    
        @Override
        public String toString() {
            return
                    "\n\tDataType: " + dataType +
                    "\n\tName: " + name +
                    "\n\tData: " + data +
                    "\n\tGroup: " + group +
                    "\n\tItems: " + items + "\n";
        }
    }

Класс предметов

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement(name = "items")
public class Items {
    private List<Item> item;

    @XmlElement(name = "item")
    public List<Item> getItem(){
        return item;
    }

    public void setItem(List<Item> itemList){
        this.item = itemList;
    }

    @Override
    public String toString() {
        return "\n" + item ;
    }
}

1 Ответ

1 голос
/ 12 июля 2020

У вас есть Optional<Item> с именем item, который содержит элемент, который пользователь хочет удалить (и может быть пустым Optional, если search не соответствует имени какого-либо элемента). Лучшее название для item будет optionalItemToRemove, чтобы пояснить, для чего он нужен.

У вас есть List<Item> с именем items, из которого вы хотите удалить item.

Мы хотим сделать это только в том случае, если Optional фактически содержит элемент, поэтому мы можем сказать:

if (item.isPresent()) {
  // remove the item
  // because we know the item is present we can safely call item.get() to get the actual Item inside the Optional
}

Чтобы удалить элемент, мы можем использовать items.removeIf(...).

Аргумент для removeIf - это Predicate<String>. Это функция, которая вызывается один раз для каждого элемента в List и возвращает true, если этот элемент должен быть удален, и false, если мы хотим его сохранить.

Мы хотим, чтобы удалите элемент, который хранится в Optional, поэтому нам нужно написать функцию, которая возвращает истину, если элемент, переданный ей, является элементом в Optional.

Подумайте и посмотрите, можете ли вы написать эту функцию , т.е.

items.removeIf(itemToCheck -> ...)

Там, где стоит многоточие, вам нужно выражение, которое проверяет, является ли itemToCheck тем элементом, который вы хотите удалить.

Сообщите нам, есть ли части этого ответа, которые вы не понимаете Не следую.

Попробуйте прочитать Javado c об используемых функциях и напишите несколько небольших тестовых программ, чтобы помочь вам понять, что они делают. Легче понять, как что-то работает в очень маленькой программе, чем пытаться использовать это в вашей более крупной программе, прежде чем вы полностью поймете, что она делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...