可选的 <Integer> 不能转换为 Int(用于 GUI 进度条)

cra*_*157 3 java swing stream jprogressbar optional

当我尝试在 JProgressBar 上设置值时,我收到以下错误。

"Optional 不能转换为 Int"

有人可以建议任何解决方法/解决方案吗?

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

从 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Rav*_*ala 5

您必须像这样打开可选项并获取其中的值。否则,你不能指定一个Optional地方int是必要的。

tL.retrieveTotalHours().orElse(0);
Run Code Online (Sandbox Code Playgroud)


Hoo*_*pje 5

Optional 意味着该值不需要存在。它基本上是在那里强制调用者明确决定当值不存在时要做什么。在您的情况下,您可以指定一个默认值:

jProgressBar1.setValue(tL.retrieveTotalHours().orElse(0));
Run Code Online (Sandbox Code Playgroud)

但是,您的retrieveTotalHours方法可能不应该首先返回 Optional。当流为空时Stream.reduce返回Optional.empty(),但在您的情况下,它可能应该0在任务列表为空时返回。所以你可以这样做:

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

0参数是标识,当流为空时返回。)

甚至:

public int retrieveTotalHours(){
    return taskList.stream().mapToInt(e -> e.getTaskHours()).sum();
}
Run Code Online (Sandbox Code Playgroud)