Необязательный <Integer> не может быть преобразован в Int (для использования на панели прогресса GUI)

Я получаю сообщение об ошибке ниже, когда я пытаюсь установить значение на JProgressBar.

"Опционально не может быть преобразовано в Int"

Может кто-нибудь, пожалуйста, посоветуйте какие-либо обходные пути / решение??

public GUI(){
    initComponents();
    tL = new TasksToDo();
    jProgressBar1.setValue(tL.retrieveTotalHours());// [Where my error occurs]}
}  

И из класса TaskToDo, изначально я установил это на ArrayList, но в предупреждениях говорилось, что нужно переключиться на Optional:

  public class TasksToDo {

    public static ArrayList<Task> taskList;

    public TasksToDo(){
        taskList = new ArrayList<Task>();
        taskList.add(new Task(0,"Whitepaper", "Write first draft of Whitepaper",  7));
        taskList.add(new Task(1,"Create Database Structure", "Plan required fields and tables",  1));
        taskList.add(new Task(2,"Setup ODBC Connections", "Create the ODBC Connections between SVR1 to DEV-SVR",  2));

    }

    public void addTask (int taskId, String taskTitle, String taskDescription,  int taskHours){}

    public ArrayList<Task> retrieveTask(){
        return taskList;
    }

    public Optional<Integer> retrieveTotalHours(){
    return taskList.stream().map(e -> e.getTaskHours()).reduce(Integer::sum);
    }
}

4 ответа

Решение

Вы должны развернуть необязательное и получить значение в нем, как это. В противном случае вы не можете назначить Optional где int нужно.

tL.retrieveTotalHours().orElse(0);

Необязательный означает, что значение не должно быть там. Это в основном там, чтобы заставить вызывающего явным образом решить, что делать, когда значение не существует. В вашем случае вы можете указать значение по умолчанию:

jProgressBar1.setValue(tL.retrieveTotalHours().orElse(0));

Тем не менее, ваш retrieveTotalHours Метод, вероятно, не должен возвращать Optional в первую очередь. Stream.reduce возвращается Optional.empty() когда поток пуст, но в вашем случае он, вероятно, должен вернуть 0 когда список задач пуст. Так что вы можете сделать:

public int retrieveTotalHours(){
    return taskList.stream().map(e -> e.getTaskHours()).reduce(0, Integer::sum);
}

(The 0 Аргумент - это идентификатор, который возвращается, когда поток пуст.)

или даже:

public int retrieveTotalHours(){
    return taskList.stream().mapToInt(e -> e.getTaskHours()).sum();
}

Если вас интересует только количество часов, вам не нужен дополнительный и можно упростить его:

public int retrieveTotalHours()
{
  return taskList.stream().mapToInt(e -> e.getTaskHours()).sum();
}

Ну, в основном, Optional<Integer> не совместим с int,

Но Integer есть (после распаковки) ... так что поменяй:

jProgressBar1.setValue(tL.retrieveTotalHours());

в

jProgressBar1.setValue(tL.retrieveTotalHours().orElse(0));

Обратите внимание, что вы должны предоставить целочисленное значение при вызове setValue. Ноль или "ничто" не приемлемо.

Другие вопросы по тегам