2025 年 Java 从入门到精通学习笔记全新版

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
MSE Nacos 企业版免费试用,1600元额度,限量50份
云原生网关 MSE Higress,422元/月
简介: 《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。

Java学习笔记:从入门到精通(2025更新版)

一、Java基础(2025版)

1.1 开发环境配置

JDK推荐使用LTS版本17最新版本21,通过SDKMAN!进行多版本管理:

# 安装SDKMAN!
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# 安装并使用Java 21
sdk install java 21.0.1-tem
sdk use java 21.0.1-tem

IDE推荐使用IntelliJ IDEA 2025.1VS Code(需安装Extension Pack for Java)。

1.2 核心语法增强

1.2.1 文本块(Java 15+)

String html = """
    <html>
        <body>
            <h1>Hello, Java 21!</h1>
        </body>
    </html>
""";

1.2.2 模式匹配(Java 17+)

// 传统写法
if (obj instanceof String) {
   
    String s = (String) obj;
    System.out.println(s.length());
}

// 模式匹配写法
if (obj instanceof String s) {
   
    System.out.println(s.length());
}

1.2.3 记录类(Java 16+)

// 传统类
class Point {
   
    private final int x;
    private final int y;

    public Point(int x, int y) {
   
        this.x = x;
        this.y = y;
    }

    // Getters, equals, hashCode, toString
}

// 记录类
record Point(int x, int y) {
   }

1.2.4 增强的switch(Java 14+)

int day = 3;
String result = switch (day) {
   
    case 1, 2, 3, 4, 5 -> "Weekday";
    case 6, 7 -> "Weekend";
    default -> throw new IllegalArgumentException("Invalid day: " + day);
};

二、面向对象编程(2025版)

2.1 密封类(Java 17+)

// 限制继承范围
public sealed interface Shape 
    permits Circle, Rectangle, Square {
   
    double area();
}

final class Circle implements Shape {
    ... }
final class Rectangle implements Shape {
    ... }
non-sealed class Square implements Shape {
    ... }

2.2 接口增强

// Java 8+ 默认方法
public interface MyInterface {
   
    default void defaultMethod() {
   
        System.out.println("Default implementation");
    }

    // Java 9+ 私有方法
    private void privateMethod() {
   
        System.out.println("Private implementation");
    }
}

三、Java进阶(2025版)

3.1 虚拟线程(Java 21+)

// 传统线程池写法
ExecutorService executor = Executors.newFixedThreadPool(200);
for (int i = 0; i < 1000; i++) {
   
    executor.submit(() -> {
   
        Thread.sleep(Duration.ofSeconds(1));
        return "Done";
    });
}

// 虚拟线程写法
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
   
    IntStream.range(0, 10000).forEach(i -> {
   
        executor.submit(() -> {
   
            Thread.sleep(Duration.ofSeconds(1));
            return "Done";
        });
    });
}

3.2 结构化并发(Java 21+)

// 并行执行多个任务
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
   
    Future<String> task1 = scope.fork(() -> fetchUser());
    Future<Integer> task2 = scope.fork(() -> fetchOrderCount());

    scope.join();           // 等待所有任务完成
    scope.throwIfFailed();  // 处理失败的任务

    String user = task1.resultNow();
    int count = task2.resultNow();
}

3.3 向量API(Java 21+)

// 传统数组计算
float[] a = new float[1024];
float[] b = new float[1024];
float[] c = new float[1024];

for (int i = 0; i < a.length; i++) {
   
    c[i] = a[i] * b[i] + 42.0f;
}

// 向量API加速计算
VectorSpecies<Float> species = FloatVector.SPECIES_PREFERRED;
for (int i = 0; i < a.length; i += species.length()) {
   
    var m = species.indexInRange(i, a.length);
    var va = FloatVector.fromArray(species, a, i, m);
    var vb = FloatVector.fromArray(species, b, i, m);
    var vc = va.mul(vb).add(42.0f);
    vc.intoArray(c, i, m);
}

四、实用类库与框架(2025版)

4.1 HTTP客户端(Java 11+)

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;

public class HttpClientExample {
   
    public static void main(String[] args) throws Exception {
   
        HttpClient client = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_2)
            .connectTimeout(Duration.ofSeconds(10))
            .build();

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.example.com/data"))
            .header("Content-Type", "application/json")
            .GET()
            .build();

        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::body)
            .thenAccept(System.out::println)
            .join();
    }
}

4.2 项目构建(Maven vs Gradle)

Gradle Kotlin DSL示例

// build.gradle.kts
plugins {
    application
    kotlin("jvm") version "1.9.20"
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web:3.2.4")
    testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
}

application {
    mainClass.set("com.example.MainKt")
}

五、微服务与云原生(2025版)

5.1 Spring Boot 3.2+

// REST API示例
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class UserServiceApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(UserServiceApplication.class, args);
    }

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
   
        return new User(id, "John Doe", "john@example.com");
    }

    record User(Long id, String name, String email) {
   }
}

5.2 容器化与Kubernetes

# Dockerfile示例
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY target/myapp.jar .
CMD ["java", "-jar", "myapp.jar"]

# Kubernetes部署示例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
      - name: user-service
        image: myregistry/user-service:1.0.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1024Mi"
            cpu: "500m"

六、响应式编程(2025版)

6.1 Reactor框架

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.Duration;

public class ReactiveExample {
   
    public static void main(String[] args) {
   
        // 创建数据流
        Flux<String> names = Flux.just("Alice", "Bob", "Charlie")
            .delayElements(Duration.ofMillis(500));

        // 转换与过滤
        Flux<String> filteredNames = names
            .filter(name -> name.length() > 4)
            .map(String::toUpperCase);

        // 订阅并消费
        filteredNames.subscribe(
            name -> System.out.println("Received: " + name),
            error -> System.err.println("Error: " + error),
            () -> System.out.println("Completed")
        );

        // 合并多个Mono
        Mono<String> mono1 = Mono.just("Hello");
        Mono<String> mono2 = Mono.just("World");

        Mono.zip(mono1, mono2)
            .map(tuple -> tuple.getT1() + " " + tuple.getT2())
            .subscribe(System.out::println);
    }
}

6.2 Spring WebFlux

// 响应式REST API
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
public class ProductController {
   

    private final ProductService productService;

    public ProductController(ProductService productService) {
   
        this.productService = productService;
    }

    @GetMapping("/products")
    public Flux<Product> getAllProducts() {
   
        return productService.findAll();
    }

    @GetMapping("/products/{id}")
    public Mono<Product> getProductById(@PathVariable String id) {
   
        return productService.findById(id);
    }
}

七、函数式编程(2025版)

7.1 Stream API增强

import java.util.List;
import java.util.stream.Stream;

public class StreamExample {
   
    public static void main(String[] args) {
   
        List<String> words = List.of("hello", "world", "java", "stream");

        // 传统流操作
        words.stream()
            .filter(w -> w.length() > 4)
            .map(String::toUpperCase)
            .forEach(System.out::println);

        // 新的takeWhile/dropWhile方法
        Stream.of(1, 2, 3, 4, 5, 2, 1)
            .takeWhile(n -> n < 5)  // [1, 2, 3, 4]
            .forEach(System.out::print);

        Stream.of(1, 2, 3, 4, 5, 2, 1)
            .dropWhile(n -> n < 5)  // [5, 2, 1]
            .forEach(System.out::print);
    }
}

7.2 函数式接口与Lambda

// 自定义函数式接口
@FunctionalInterface
interface TriFunction<T, U, V, R> {
   
    R apply(T t, U u, V v);
}

// 使用示例
TriFunction<Integer, Integer, Integer, Integer> sum = (a, b, c) -> a + b + c;
int result = sum.apply(1, 2, 3); // 6

八、测试技术(2025版)

8.1 JUnit 5与Mockito

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
   

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testGetUserById() {
   
        // 模拟存储库行为
        when(userRepository.findById(1L))
            .thenReturn(new User(1L, "John Doe", "john@example.com"));

        // 执行测试
        User result = userService.getUserById(1L);

        // 验证结果
        assertNotNull(result);
        assertEquals("John Doe", result.getName());
        verify(userRepository, times(1)).findById(1L);
    }
}

8.2 测试容器

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
@SpringBootTest
public class DatabaseIntegrationTest {
   

    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15-alpine")
        .withDatabaseName("testdb")
        .withUsername("test")
        .withPassword("test");

    @DynamicPropertySource
    static void configureProperties(DynamicPropertyRegistry registry) {
   
        registry.add("spring.datasource.url", postgres::getJdbcUrl);
        registry.add("spring.datasource.username", postgres::getUsername);
        registry.add("spring.datasource.password", postgres::getPassword);
    }

    @Test
    void contextLoads() {
   
        // 测试数据库连接
    }
}

九、数据持久化(2025版)

9.1 Spring Data JPA 3.2+

// 实体类
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Product {
   
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
    // getters/setters
}

// 仓库接口
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;

public interface ProductRepository extends JpaRepository<Product, Long> {
   
    List<Product> findByNameContaining(String name);

    @Query("SELECT p FROM Product p WHERE p.price > :minPrice")
    List<Product> findByPriceGreaterThan(double minPrice);
}

9.2 响应式数据访问(R2DBC)

// R2DBC响应式仓库
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Flux;

public interface UserRepository extends ReactiveCrudRepository<User, Long> {
   
    Flux<User> findByLastName(String lastName);
}

// 使用示例
@Service
public class UserService {
   
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
   
        this.userRepository = userRepository;
    }

    public Flux<User> getUsersByLastName(String lastName) {
   
        return userRepository.findByLastName(lastName);
    }
}

十、实战项目:Todo应用(2025版)

10.1 项目架构

todo-app/
├── todo-backend/            # Spring Boot后端
│   ├── src/
│   │   ├── main/
│   │   │   ├── java/com/example/todo/
│   │   │   │   ├── controller/      # REST控制器
│   │   │   │   ├── service/         # 业务逻辑
│   │   │   │   ├── repository/      # 数据访问
│   │   │   │   ├── entity/          # 实体类
│   │   │   │   └── TodoApplication.java
│   │   │   └── resources/
│   │   │       ├── application.yml  # 配置文件
│   │   │       └── static/          # 静态资源
│   │   └── test/
│   │       └── java/com/example/todo/ # 测试类
│   └── pom.xml
└── todo-frontend/           # React前端
    ├── src/
    │   ├── components/      # React组件
    │   ├── services/        # API服务
    │   ├── App.jsx
    │   └── index.jsx
    └── package.json

10.2 后端核心代码

// Todo实体
@Entity
public class Todo {
   
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private boolean completed;
    // getters/setters
}

// Todo控制器
@RestController
@RequestMapping("/api/todos")
public class TodoController {
   
    private final TodoService todoService;

    @GetMapping
    public List<Todo> getAllTodos() {
   
        return todoService.getAllTodos();
    }

    @PostMapping
    public Todo createTodo(@RequestBody Todo todo) {
   
        return todoService.createTodo(todo);
    }

    @PutMapping("/{id}")
    public Todo updateTodo(@PathVariable Long id, @RequestBody Todo todoDetails) {
   
        return todoService.updateTodo(id, todoDetails);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<?> deleteTodo(@PathVariable Long id) {
   
        todoService.deleteTodo(id);
        return ResponseEntity.ok().build();
    }
}

10.3 前端核心代码(React + Vite)

// TodoList组件
import React, { useState, useEffect } from 'react';
import axios from 'axios';

const TodoList = () => {
  const [todos, setTodos] = useState([]);
  const [newTodo, setNewTodo] = useState('');

  useEffect(() => {
    fetchTodos();
  }, []);

  const fetchTodos = async () => {
    const response = await axios.get('/api/todos');
    setTodos(response.data);
  };

  const handleCreateTodo = async () => {
    if (!newTodo.trim()) return;
    await axios.post('/api/todos', { title: newTodo, completed: false });
    setNewTodo('');
    fetchTodos();
  };

  const handleToggleComplete = async (id, completed) => {
    await axios.put(`/api/todos/${id}`, { completed });
    fetchTodos();
  };

  return (
    <div className="container mx-auto p-4">
      <h1 className="text-2xl font-bold mb-4">Todo List</h1>

      <div className="flex mb-4">
        <input
          type="text"
          value={newTodo}
          onChange={(e) => setNewTodo(e.target.value)}
          className="flex-1 p-2 border rounded-l-md"
          placeholder="Add new todo"
        />
        <button
          onClick={handleCreateTodo}
          className="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-r-md"
        >
          Add
        </button>
      </div>

      <ul className="space-y-2">
        {todos.map((todo) => (
          <li
            key={todo.id}
            className={`flex items-center p-2 ${
              todo.completed ? 'bg-gray-100 line-through' : 'bg-white'
            } rounded-md`}
          >
            <input
              type="checkbox"
              checked={todo.completed}
              onChange={() => handleToggleComplete(todo.id, !todo.completed)}
              className="mr-2"
            />
            <span>{todo.title}</span>
          </li>
        ))}
      </ul>
    </div>
  );
};

export default TodoList;

以上代码示例涵盖了Java 21的最新特性、现代开发工具链以及微服务架构,帮助你快速掌握Java开发的核心技能。建议通过实际项目练习来加深理解,例如构建一个完整的Web应用或微服务系统。

--
Java 入门,Java 精通,Java 学习笔记,2025Java,Java 编程,Java 核心技术,Java 开发,Java 零基础,Java 面向对象,Java 框架,SpringBoot,JavaWeb,Java 并发编程,JavaEE,Java 实战


--
代码获取方式
https://pan.quark.cn/s/14fcf913bae6

--

相关文章
|
1月前
|
IDE Java 数据挖掘
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
127 35
|
1月前
|
监控 Java 测试技术
2025 年 Java 核心技术从入门到精通实战指南
《2025年Java核心技术实战指南》全面覆盖Java开发的最新趋势与最佳实践。内容包括Java新特性(如模式匹配、文本块、记录类)、微服务架构(Spring Boot 3.0+、Spring Cloud)、响应式编程(Reactor、WebFlux)、容器化与云原生(Docker、Kubernetes)、数据访问技术(JPA、R2DBC)、函数式编程、单元测试与集成测试(JUnit 5、Mockito)、性能优化与监控等。通过实战案例,帮助开发者掌握构建高性能、高可用系统的技能。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
131 7
|
1月前
|
消息中间件 Java 微服务
2025 版 Java 学习路线实战指南从入门到精通
《Java学习路线实战指南(2025版)》是一份全面的Java开发学习手册,涵盖基础环境搭建、核心语法与新特性、数据结构与算法、微服务架构、云原生技术栈、AI融合及项目实战。内容包括JDK安装配置、IntelliJ IDEA设置、Records类与模式匹配增强、LeetCode题解、Spring Cloud微服务开发、Kubernetes部署、OpenAI API调用等。结合在线商城系统案例,采用Vue 3、Spring Boot 3.5、MySQL、Elasticsearch等技术,提供从理论到实践的完整路径,助力开发者掌握2025年最新趋势与最佳实践。
175 4
|
4月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
65 13
|
24天前
|
Oracle Java 关系型数据库
java 入门学习视频_2025 最新 java 入门零基础学习视频教程
《Java 21 入门实操指南(2025年版)》提供了Java最新特性的开发指导。首先介绍了JDK 21和IntelliJ IDEA 2025.1的环境配置,包括环境变量设置和预览功能启用。重点讲解了Java 21三大核心特性:虚拟线程简化高并发编程,Record模式优化数据解构,字符串模板提升字符串拼接可读性。最后通过图书管理系统案例,展示如何运用Record定义实体类、使用Stream API进行数据操作,以及结合字符串模板实现控制台交互。该指南完整呈现了从环境搭建到实际项目开发的Java 21全流程实
53 1
|
27天前
|
算法 Java 测试技术
Java 从入门到实战完整学习路径与项目实战指南
本文详细介绍了“Java从入门到实战”的学习路径与应用实例,涵盖基础、进阶、框架工具及项目实战四个阶段。内容包括环境搭建、语法基础、面向对象编程,数据结构与算法、多线程并发、JVM原理,以及Spring框架等核心技术。通过学生管理系统、文件下载器和博客系统等实例,帮助读者将理论应用于实践。最后,提供全链路电商系统的开发方案,涉及前后端技术栈与分布式架构。附代码资源链接,助力成为合格的Java开发者。
53 4
|
1月前
|
监控 Java API
Java 异步编程难题拆解实操指南:从入门到精通解决异步编程关键问题
本文深入探讨了Java异步编程的实操技巧,基于Project Reactor与Spring WebFlux等技术框架,通过具体案例解决常见难题。内容涵盖反应式编程基础、回调地狱解决方案、并行任务处理、响应式REST API开发、背压策略应用、微服务异步通信及性能监控等方面。结合代码示例,详细讲解了如何构建高性能异步应用,并总结了最佳实践,帮助开发者掌握异步编程的核心技能。适合希望提升异步开发能力的技术人员阅读。
53 3
|
1月前
|
前端开发 Java 微服务
2025 年全网超全 Java 从入门到精通学习路线指南
这是一份全面的Java学习路线图,涵盖从基础到进阶的知识体系。基础阶段包括环境搭建、语法学习与面向对象编程;进阶阶段深入数据结构、多线程、JVM原理及泛型集合;框架阶段掌握Spring、MyBatis等工具;数据库阶段学习SQL、MySQL及Redis;前端技术涉及HTML、CSS与Vue;分布式阶段探讨微服务架构、Docker与Kubernetes;最后通过企业级项目实战提升性能优化与代码重构能力。资源地址:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
509 7
|
1月前
|
Java 数据库连接 API
2025 更新必看:Java 编程基础入门级超级完整版指南
本教程为2025更新版Java编程基础入门指南,涵盖开发环境搭建(SDKMAN!管理JDK、VS Code配置)、Java 17+新特性(文本块、Switch表达式增强、Record类)、面向对象编程(接口默认方法、抽象类与模板方法)、集合框架深度应用(Stream API高级操作、并发集合)、模式匹配与密封类等。还包括学生成绩管理系统实战项目,涉及Maven构建、Lombok简化代码、JDBC数据库操作及JavaFX界面开发。同时提供JUnit测试、日志框架使用技巧及进阶学习资源推荐,助你掌握Java核心技术并迈向高级开发。
153 5
|
27天前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
120 0