Java
18 items
Series Posts
Part 1: Java 8: The Functional Revolution
Java 8 was the most transformative release in the language's history — introducing lambda expressions, the Stream API, Optional, default interface methods, and a brand-new Date/Time API. This part covers every major feature with deep conceptual explanations and practical examples.
Part 0: The Azure Ascent: A Backend Engineer's Journey to Cloud Mastery
Welcome to the Azure Ascent—a comprehensive 6-part tutorial series for experienced backend engineers. Follow Marcus as he builds CloudVault, a fintech platform, from the ground up on Azure. This series combines deep conceptual explanations with 40+ production-ready Java code examples, taking you from fundamentals through enterprise-grade deployment.
Part 2: Java 9: Modules, JShell, and a Smarter Platform
Java 9 introduced Project Jigsaw — the Java Platform Module System — fundamentally restructuring the JDK itself. It also brought JShell (the first REPL for Java), convenient collection factory methods, a new HTTP client, and a raft of API improvements.
Part 1: Part 1: The Summit Awaits — Azure Fundamentals & Core Concepts
Marcus begins his Azure journey by understanding the platform's organizational model. We explore subscriptions, resource groups, regions, and the Azure Resource Manager. Learn how Azure's architecture differs from AWS and why these foundational concepts matter for your designs.
Part 3: Java 10: Local-Variable Type Inference with var
Java 10 was a focused release, best known for introducing the var keyword — local-variable type inference. While small in scope, var meaningfully reduced verbosity in everyday Java code. This part covers var in depth, along with the other improvements in Java 10.
Part 2: Part 2: Building the Engine — Azure Compute Services
CloudVault needs to deploy its microservices. Marcus explores four compute options—Virtual Machines, App Service, Azure Functions, and Containers. We build a production-ready Java Spring Boot API and learn when to use each service for different workloads.
Part 4: Java 11: The New LTS Baseline
Java 11 became the new long-term support baseline, replacing Java 8 for most enterprises. It standardised the HTTP Client, added powerful String and Files utility methods, allowed var in lambda parameters, and introduced the experimental Z Garbage Collector.
Part 3: Part 3: Storing the Treasures — Azure Data & Storage Services
CloudVault's data is growing fast. Marcus explores Azure's data services—SQL Database for relational data, Cosmos DB for globally distributed workloads, and Blob Storage for files. We design a multi-tier data architecture and implement production-ready Java code for each service.
Part 5: Java 12 & 13: Switch Expressions and Text Blocks Begin
Java 12 and 13 were transitional releases that introduced two features in preview that would become cornerstones of modern Java — switch expressions and text blocks (multiline strings). Java 12 also added the Teeing collector and Compact Number Formatting.
Part 4: Part 4: Connecting the Dots — Azure Networking & Security
Marcus designs a secure, multi-tier architecture for CloudVault. We explore Virtual Networks, Network Security Groups, Azure Key Vault for secrets management, and identity/access control with Azure AD. Learn how to design networks that protect your data while enabling communication between services.
Part 6: Java 14 & 15: Records, Text Blocks, and Sealed Classes
Java 14 finalised switch expressions and previewed records and pattern matching for instanceof. Java 15 made text blocks production-ready, introduced sealed classes in preview, and delivered the long-awaited helpful NullPointerExceptions. Together they laid the groundwork for modern Java's data-oriented programming model.
Part 5: Part 5: The Intelligent Layer — Azure AI & Machine Learning
CloudVault wants to add intelligent features to their platform. Marcus explores Azure AI Services (Vision, Language, Speech), Azure OpenAI for LLMs, and Azure Machine Learning. We integrate AI capabilities into a Java backend application and understand when to use pre-built APIs vs. custom models.
Part 7: Java 16 & 17: The Modern LTS Baseline
Java 16 finalised records and pattern matching for instanceof. Java 17 became the new LTS release, finalising sealed classes and introducing pattern matching for switch in preview. Together they define the modern Java baseline that most teams target today.
Part 6: Part 6: Automating the Climb — Azure DevOps & Deployment
Marcus faces his final challenge—automate everything. We build a complete CI/CD pipeline using GitHub Actions, implement Infrastructure as Code with Bicep, set up monitoring with Application Insights, and establish production-ready deployment practices including blue-green and canary deployments.
Part 8: Java 18, 19 & 20: Virtual Threads on the Horizon
Java 18, 19, and 20 were bridge releases between the Java 17 and Java 21 LTS versions. They introduced UTF-8 as the default charset, a simple built-in web server, and — most significantly — previewed virtual threads, structured concurrency, and record patterns that would be finalised in Java 21.
Part 9: Java 21: The Concurrency Revolution — LTS
Java 21 is a landmark LTS release. It finalised virtual threads (Project Loom), sequenced collections, record patterns, and pattern matching for switch — while previewing string templates and unnamed classes. It is the most feature-rich LTS release since Java 8.
Part 10: Java 22 & 23: Unnamed Variables and Foreign Memory
Java 22 finalised the Foreign Function and Memory API and introduced unnamed variables and patterns. Java 23 continued refining previews including primitive types in patterns and module import declarations. Together they represent the platform's ongoing maturation.
Part 11: Java 24 & 25: The Next LTS — Simpler, Faster, Safer
Java 24 delivered ahead-of-time class loading and stream gatherers. Java 25 is the next LTS release, finalising scoped values, compact source files, flexible constructor bodies, module import declarations, and primitive type patterns — while introducing compact object headers for significant memory savings.