Как я могу использовать карту для изменения существующих элементов в потоке? - PullRequest
2 голосов
/ 10 июля 2020

У меня есть объект, который я искал, и указанный объект хранится в потоке. Я хотел бы дать пользователю возможность изменять элементы в существующем потоке и обновлять существующий список измененными элементами вместо того, чтобы создавать новый список в целом. Вопрос похож на этот one , за исключением того, что пользователь добавляет измененные элементы в новый список

Вот что у меня есть. В настоящее время я получаю эту ошибку

Оператор '+' не может применяться к 'void', 'void'

Если вам нужен весь код или включение других классов, дайте мне знать.

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

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

            Optional<Item> item = 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(item.toString());

            System.out.println("\nEnter the new datatype of the movie (Number): ");
            String userChoice = scan.nextLine();

            System.out.println("\nEnter the new name of the movie: ");
            String userChoice1 = scan.nextLine();

            System.out.println("\nEnter the new data ID for the movie (Number): ");
            int userChoice2 = scan.nextInt();
            scan.nextLine();

            System.out.println("\nEnter the new group for the movie: ");
            String userChoice3 = scan.nextLine();

            Collection::stream =
                    item.map(s -> s.setDataType(userChoice) + s.setName(userChoice1) + s.setData(userChoice2) + s.setGroup(userChoice3));
        }

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

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 ;
    }
}

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

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";
    }

    public String singleObject(){
        return
                "\n\tDataType: " + dataType +
                "\n\tName: " + name +
                "\n\tData: " + data +
                "\n\tGroup: " + group;
    }

}

Ответы [ 3 ]

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

Я вижу, что в вашей основной функции вы просите пользователя указать имя mov ie, а затем о полях, которые нужно изменить. Поэтому, задав пользователю все вопросы, вы можете использовать следующую операцию:

items.stream()
     // search for the movie by name
     .filter(x -> x.getName().equals(search))
     .findFirst()
     // if present then modify it
     .ifPresent(i -> {
        i.setDataType(userChoice);
        i.setName(userChoice1);
        i.setData(userChoice2);
        i.setGroup(userChoice3);
        i.setItems(null);
        });

Таким образом, список изменяется на месте.

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

В операторе item.map() вы вызываете сеттер, который возвращает void, поэтому у вас возникает проблема. Void не является допустимым типом возврата для метода карты. + Оператор также не может применяться к пустому операнду.

Пара наблюдений

  1. if(choice == 2)
  • Здесь вы должны сделать только одно задача изменения mov ie, присутствующего в списке, если mov ie отсутствует в списке, сообщить об этом пользователю.
Items class содержат List<Item>
  • теперь не нужно добавлять элементы внутри класса Item.

Ниже приведен пример кода, который я пробовал

Он находит имя mov ie, введенное пользователем в Items, и изменяет его там вместо создания полностью нового списка.

. items.getItem().stream()  
.filter(x -> x.getName.equals(search))
.forEach(x -> {x.setName(userInputName); x.setDatType(userInputDataType)});
0 голосов
/ 10 июля 2020

Вы написали очень сложный код. Пара наблюдений:

  1. if (choice == 2) здесь вы должны выполнить только одну задачу по изменению mov ie, присутствующего в списке, если mov ie отсутствует в списке, сообщите пользователь об этом вместо того, чтобы добавлять его.
  2. Класс Items содержит список элементов, теперь нет необходимости добавлять элементы внутри класса Item, если только это не классы сущностей, которые вы хотите сохранить в БД.

В любом случае ниже приведен фрагмент кода, надеюсь, он поможет.

items.getItem().stream().filter(x -> x.getName.equals(search)).forEach(x -> {x.setName(userInputName); x.setDatType(userInputDataType)});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...