Необязательный <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. Ноль или "ничто" не приемлемо.