本文目录导读:

我来为您介绍一个Java最小可行产品(MVP)案例,实现一个简单的任务管理应用。
项目结构
task-manager/
├── src/
│ └── main/java/com/example/
│ ├── model/Task.java
│ ├── service/TaskService.java
│ └── Main.java
└── pom.xml
Maven依赖 (pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>task-manager</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- Jackson for JSON processing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
</dependencies>
</project>
任务模型 (Task.java)
package com.example.model;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.UUID;
public class Task {
private String id;
private String title;
private String description;
private boolean completed;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public Task() {
this.id = UUID.randomUUID().toString();
this.createdAt = LocalDateTime.now();
this.updatedAt = LocalDateTime.now();
this.completed = false;
}
public Task(String title, String description) {
this();
this.title = title;
this.description = description;
}
// Getters and Setters
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) {
this.title = title;
this.updatedAt = LocalDateTime.now();
}
public String getDescription() { return description; }
public void setDescription(String description) {
this.description = description;
this.updatedAt = LocalDateTime.now();
}
public boolean isCompleted() { return completed; }
public void setCompleted(boolean completed) {
this.completed = completed;
this.updatedAt = LocalDateTime.now();
}
public LocalDateTime getCreatedAt() { return createdAt; }
public LocalDateTime getUpdatedAt() { return updatedAt; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Task task = (Task) o;
return Objects.equals(id, task.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return String.format("Task{id='%s', title='%s', completed=%s, createdAt=%s}",
id, title, completed, createdAt);
}
}
任务服务 (TaskService.java)
package com.example.service;
import com.example.model.Task;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class TaskService {
private final Map<String, Task> tasks;
private final ObjectMapper objectMapper;
private static final String DATA_FILE = "tasks.json";
public TaskService() {
this.tasks = new ConcurrentHashMap<>();
this.objectMapper = new ObjectMapper();
this.objectMapper.registerModule(new JavaTimeModule());
loadTasks();
}
// 创建任务
public Task createTask(String title, String description) {
Task task = new Task(title, description);
tasks.put(task.getId(), task);
saveTasks();
return task;
}
// 获取所有任务
public List<Task> getAllTasks() {
return new ArrayList<>(tasks.values());
}
// 获取单个任务
public Optional<Task> getTask(String id) {
return Optional.ofNullable(tasks.get(id));
}
// 更新任务
public Optional<Task> updateTask(String id, String title, String description, Boolean completed) {
Task task = tasks.get(id);
if (task != null) {
if (title != null) task.setTitle(title);
if (description != null) task.setDescription(description);
if (completed != null) task.setCompleted(completed);
saveTasks();
return Optional.of(task);
}
return Optional.empty();
}
// 删除任务
public boolean deleteTask(String id) {
Task removed = tasks.remove(id);
if (removed != null) {
saveTasks();
return true;
}
return false;
}
// 搜索任务
public List<Task> searchTasks(String keyword) {
List<Task> result = new ArrayList<>();
String lowerKeyword = keyword.toLowerCase();
for (Task task : tasks.values()) {
if (task.getTitle().toLowerCase().contains(lowerKeyword) ||
task.getDescription().toLowerCase().contains(lowerKeyword)) {
result.add(task);
}
}
return result;
}
// 获取统计信息
public Map<String, Object> getStatistics() {
Map<String, Object> stats = new HashMap<>();
List<Task> allTasks = getAllTasks();
stats.put("total", allTasks.size());
stats.put("completed", allTasks.stream().filter(Task::isCompleted).count());
stats.put("pending", allTasks.stream().filter(t -> !t.isCompleted()).count());
return stats;
}
// 持久化到文件
private void saveTasks() {
try {
objectMapper.writerWithDefaultPrettyPrinter()
.writeValue(new File(DATA_FILE), getAllTasks());
} catch (IOException e) {
System.err.println("保存任务失败: " + e.getMessage());
}
}
// 从文件加载
private void loadTasks() {
File file = new File(DATA_FILE);
if (file.exists()) {
try {
List<Task> loadedTasks = objectMapper.readValue(
file,
new TypeReference<List<Task>>() {}
);
loadedTasks.forEach(task -> tasks.put(task.getId(), task));
} catch (IOException e) {
System.err.println("加载任务失败: " + e.getMessage());
}
}
}
}
主程序入口 (Main.java)
package com.example;
import com.example.model.Task;
import com.example.service.TaskService;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Main {
private static final Scanner scanner = new Scanner(System.in);
private static final TaskService taskService = new TaskService();
public static void main(String[] args) {
System.out.println("=== 任务管理器 MVP ===");
System.out.println("最小可行产品 - 基于控制台的简单任务管理");
while (true) {
showMenu();
String choice = scanner.nextLine().trim();
if ("0".equals(choice)) {
System.out.println("谢谢使用,再见!");
break;
}
handleChoice(choice);
}
scanner.close();
}
private static void showMenu() {
System.out.println("\n请选择操作:");
System.out.println("1. 创建任务");
System.out.println("2. 查看所有任务");
System.out.println("3. 查看任务详情");
System.out.println("4. 更新任务");
System.out.println("5. 删除任务");
System.out.println("6. 搜索任务");
System.out.println("7. 查看统计信息");
System.out.println("0. 退出");
System.out.print("请输入选择: ");
}
private static void handleChoice(String choice) {
switch (choice) {
case "1":
createTask();
break;
case "2":
listAllTasks();
break;
case "3":
viewTaskDetails();
break;
case "4":
updateTask();
break;
case "5":
deleteTask();
break;
case "6":
searchTasks();
break;
case "7":
showStatistics();
break;
default:
System.out.println("无效选择,请重新输入");
}
}
private static void createTask() {
System.out.print("请输入任务标题: ");
String title = scanner.nextLine().trim();
System.out.print("请输入任务描述: ");
String description = scanner.nextLine().trim();
if (title.isEmpty()) {
System.out.println("标题不能为空!");
return;
}
Task task = taskService.createTask(title, description);
System.out.println("任务创建成功!ID: " + task.getId());
}
private static void listAllTasks() {
List<Task> tasks = taskService.getAllTasks();
if (tasks.isEmpty()) {
System.out.println("暂无任务");
return;
}
System.out.println("\n=== 任务列表 ===");
for (int i = 0; i < tasks.size(); i++) {
Task task = tasks.get(i);
String status = task.isCompleted() ? "[已完成]" : "[待完成]";
System.out.printf("%d. %s %s%n", i + 1, status, task.getTitle());
}
}
private static void viewTaskDetails() {
System.out.print("请输入任务ID: ");
String id = scanner.nextLine().trim();
taskService.getTask(id).ifPresentOrElse(
task -> {
System.out.println("\n=== 任务详情 ===");
System.out.println("ID: " + task.getId());
System.out.println("标题: " + task.getTitle());
System.out.println("描述: " + task.getDescription());
System.out.println("状态: " + (task.isCompleted() ? "已完成" : "待完成"));
System.out.println("创建时间: " + task.getCreatedAt());
System.out.println("更新时间: " + task.getUpdatedAt());
},
() -> System.out.println("任务不存在")
);
}
private static void updateTask() {
System.out.print("请输入要更新的任务ID: ");
String id = scanner.nextLine().trim();
System.out.print("新标题 (直接回车保持不变): ");
String title = scanner.nextLine().trim();
title = title.isEmpty() ? null : title;
System.out.print("新描述 (直接回车保持不变): ");
String description = scanner.nextLine().trim();
description = description.isEmpty() ? null : description;
System.out.print("是否完成? (y/n/直接回车保持不变): ");
String completeInput = scanner.nextLine().trim().toLowerCase();
Boolean completed = null;
if ("y".equals(completeInput)) completed = true;
else if ("n".equals(completeInput)) completed = false;
taskService.updateTask(id, title, description, completed)
.ifPresentOrElse(
task -> System.out.println("更新成功!"),
() -> System.out.println("更新失败,任务不存在")
);
}
private static void deleteTask() {
System.out.print("请输入要删除的任务ID: ");
String id = scanner.nextLine().trim();
System.out.print("确认删除? (y/n): ");
String confirm = scanner.nextLine().trim().toLowerCase();
if ("y".equals(confirm)) {
if (taskService.deleteTask(id)) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败,任务不存在");
}
} else {
System.out.println("已取消删除");
}
}
private static void searchTasks() {
System.out.print("请输入搜索关键词: ");
String keyword = scanner.nextLine().trim();
List<Task> results = taskService.searchTasks(keyword);
if (results.isEmpty()) {
System.out.println("未找到匹配的任务");
return;
}
System.out.println("\n=== 搜索结果 ===");
for (Task task : results) {
String status = task.isCompleted() ? "[已完成]" : "[待完成]";
System.out.printf("- %s %s (ID: %s)%n", status, task.getTitle(), task.getId());
}
}
private static void showStatistics() {
Map<String, Object> stats = taskService.getStatistics();
System.out.println("\n=== 统计信息 ===");
System.out.println("总任务数: " + stats.get("total"));
System.out.println("已完成: " + stats.get("completed"));
System.out.println("待完成: " + stats.get("pending"));
long total = (long) stats.get("total");
if (total > 0) {
long completed = (long) stats.get("completed");
double completionRate = (double) completed / total * 100;
System.out.printf("完成率: %.1f%%%n", completionRate);
}
}
}
快速运行
# 编译 mvn clean compile # 运行 mvn exec:java -Dexec.mainClass="com.example.Main"
MVP核心功能
✅ CRUD操作:创建、读取、更新、删除任务
✅ 数据持久化:保存到JSON文件
✅ 搜索功能:按关键字搜索
✅ 统计信息:查看任务完成情况
✅ 友好的命令行界面:交互式操作
✅ 错误处理:基本的异常处理
这个MVP包含了任务管理应用的核心功能,可以直接运行使用,您可以根据需要扩展更多功能,如数据库支持、REST API、图形界面等。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播