可选 <Integer> 无法转换为 Int(用于 GUI 进度条)
Optional <Integer> cannot be converted to Int (for use on GUI Progress Bar)
当我尝试在 JProgressBar 上设置值时收到以下错误。
"Optional cannot be converted to Int"
有人可以请教任何 workarounds/Solution 吗??
public GUI(){
initComponents();
tL = new TasksToDo();
jProgressBar1.setValue(tL.retrieveTotalHours());// [Where my error occurs]}
}
并且从 TaskToDo Class,最初我将其设置为 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);
}
}
你必须像这样打开可选的并获取其中的值。否则,您无法在需要 int
的地方分配 Optional
。
tL.retrieveTotalHours().orElse(0);
嗯,基本上,Optional<Integer>
与 int
的赋值不兼容。
但是 Integer
是(拆箱后)...所以更改:
jProgressBar1.setValue(tL.retrieveTotalHours());
到
jProgressBar1.setValue(tL.retrieveTotalHours().orElse(0));
请注意,您在调用 setValue 时必须提供一个整数值。 Null 或 "nothing" 是不可接受的。
Optional 意味着该值不需要存在。它基本上是强制调用者明确决定当值不存在时要做什么。在您的情况下,您可以指定一个默认值:
jProgressBar1.setValue(tL.retrieveTotalHours().orElse(0));
但是,您的 retrieveTotalHours
方法可能首先不应该 return 一个 Optional。 Stream.reduce
returns Optional.empty()
当流为空时,但在您的情况下,当任务列表为空时,它可能应该 return 0
。所以你可以这样做:
public int retrieveTotalHours(){
return taskList.stream().map(e -> e.getTaskHours()).reduce(0, Integer::sum);
}
(0
参数是身份,当流为空时returned。)
甚至:
public int retrieveTotalHours(){
return taskList.stream().mapToInt(e -> e.getTaskHours()).sum();
}
如果您只对小时总和感兴趣,则不需要 Optional 并且可以使其更简单:
public int retrieveTotalHours()
{
return taskList.stream().mapToInt(e -> e.getTaskHours()).sum();
}
当我尝试在 JProgressBar 上设置值时收到以下错误。
"Optional cannot be converted to Int"
有人可以请教任何 workarounds/Solution 吗??
public GUI(){
initComponents();
tL = new TasksToDo();
jProgressBar1.setValue(tL.retrieveTotalHours());// [Where my error occurs]}
}
并且从 TaskToDo Class,最初我将其设置为 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);
}
}
你必须像这样打开可选的并获取其中的值。否则,您无法在需要 int
的地方分配 Optional
。
tL.retrieveTotalHours().orElse(0);
嗯,基本上,Optional<Integer>
与 int
的赋值不兼容。
但是 Integer
是(拆箱后)...所以更改:
jProgressBar1.setValue(tL.retrieveTotalHours());
到
jProgressBar1.setValue(tL.retrieveTotalHours().orElse(0));
请注意,您在调用 setValue 时必须提供一个整数值。 Null 或 "nothing" 是不可接受的。
Optional 意味着该值不需要存在。它基本上是强制调用者明确决定当值不存在时要做什么。在您的情况下,您可以指定一个默认值:
jProgressBar1.setValue(tL.retrieveTotalHours().orElse(0));
但是,您的 retrieveTotalHours
方法可能首先不应该 return 一个 Optional。 Stream.reduce
returns Optional.empty()
当流为空时,但在您的情况下,当任务列表为空时,它可能应该 return 0
。所以你可以这样做:
public int retrieveTotalHours(){
return taskList.stream().map(e -> e.getTaskHours()).reduce(0, Integer::sum);
}
(0
参数是身份,当流为空时returned。)
甚至:
public int retrieveTotalHours(){
return taskList.stream().mapToInt(e -> e.getTaskHours()).sum();
}
如果您只对小时总和感兴趣,则不需要 Optional 并且可以使其更简单:
public int retrieveTotalHours()
{
return taskList.stream().mapToInt(e -> e.getTaskHours()).sum();
}