可选 <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();
}