Skip to content

实战案例

这一节通过实际案例展示 JDK 新特性的应用。

案例一:数据处理管道

java
import java.util.*;
import java.util.stream.*;

public class DataPipelineDemo {

    static class Product {
        String name;
        double price;
        String category;

        Product(String name, double price, String category) {
            this.name = name;
            this.price = price;
            this.category = category;
        }

        @Override
        public String toString() {
            return name + " - " + price + " - " + category;
        }
    }

    public static void main(String[] args) {
        List<Product> products = Arrays.asList(
            new Product("手机", 2999, "电子产品"),
            new Product("电脑", 5999, "电子产品"),
            new Product("桌子", 599, "家具"),
            new Product("椅子", 299, "家具")
        );

        // 按类别分组,计算每组平均价格
        Map<String, Double> avgByCategory = products.stream()
            .collect(
                Collectors.groupingBy(
                    p -> p.category,
                    Collectors.averagingDouble(p -> p.price)
                )
            );

        System.out.println("各品类平均价格:");
        avgByCategory.forEach((cat, avg) ->
            System.out.println("  " + cat + ": " + avg)
        );

        // 找出最贵的产品
        Product maxPrice = products.stream()
            .max(Comparator.comparingDouble(p -> p.price))
            .orElse(null);
        System.out.println("\n最贵产品: " + maxPrice);
    }
}

案例二:并发下载器

java
import java.net.URI;
import java.net.http.*;
import java.util.*;
import java.util.concurrent.*;

public class ConcurrentDownloaderDemo {

    public static void main(String[] args) throws Exception {
        List<String> urls = Arrays.asList(
            "https://example.com/1",
            "https://example.com/2",
            "https://example.com/3"
        );

        // 使用虚拟线程进行并发下载
        try (ExecutorService executor =
                Executors.newVirtualThreadPerTaskExecutor()) {

            List<Future<String>> futures = new ArrayList<>();

            for (String url : urls) {
                futures.add(executor.submit(() -> download(url)));
            }

            for (Future<String> future : futures) {
                System.out.println("Result: " + future.get());
            }
        }
    }

    static String download(String url) {
        // 模拟下载
        return "Downloaded: " + url;
    }
}

案例三:配置对象

java
public class ConfigRecordDemo {

    // 使用 Record 替代 POJO
    record Config(
        String host,
        int port,
        String username,
        String password
    ) {}

    public static void main(String[] args) {
        Config config = new Config("localhost", 8080, "admin", "123456");

        // 自动生成 equals, hashCode, toString
        System.out.println(config);
        System.out.println("Host: " + config.host());
        System.out.println("Port: " + config.port());
    }
}

案例四:HTTP API 调用

java
import java.net.URI;
import java.net.http.*;

public class HttpApiClientDemo {

    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();

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

        HttpResponse<String> response = client.send(request,
            HttpResponse.BodyHandlers.ofString());

        System.out.println("Status: " + response.statusCode());
        System.out.println("Body: " + response.body());
    }
}

案例五:模式匹配简化代码

java
public class PatternMatchingDemo {

    public static void main(String[] args) {
        Object[] data = {42, "hello", List.of(1, 2), null, 3.14};

        for (Object item : data) {
            String description = switch (item) {
                case Integer i -> "整数: " + i;
                case String s -> "字符串: " + s;
                case null -> "null 值";
                default -> "其他类型: " + item.getClass().getSimpleName();
            };
            System.out.println(description);
        }
    }
}

小结

JDK 新特性可以简化代码,提高可读性和性能。

选择合适的特性:

场景推荐特性
日志处理Stream
数据转换Lambda + Stream
并发处理虚拟线程
替代 POJORecord

基于 VitePress 构建