<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Learn Java 25</title>
    <link>https://learn-java-25.pages.dev/index.html</link>
    <description>A two-day course on modern Java, based on Java 25 (LTS). No Java experience needed. Programming experience in any language helps.&#xA;Everything here runs on a plain JDK 25 install — no build tool, no framework, no boilerplate.&#xA;Why Java 25? Java 25 is the current LTS release (September 2025), the successor to Java 21. It adds compact source files, java.lang.IO, module imports, flexible constructor bodies and scoped values.</description>
    <generator>Hugo</generator>
    <language>en</language>
    <atom:link href="https://learn-java-25.pages.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Course Introduction</title>
      <link>https://learn-java-25.pages.dev/01-introduction/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://learn-java-25.pages.dev/01-introduction/index.html</guid>
      <description>Get a JDK 25 running, then meet JShell — the fastest way to try Java out.</description>
    </item>
    <item>
      <title>Day 1: Intro to Java</title>
      <link>https://learn-java-25.pages.dev/02-intro-to-java/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://learn-java-25.pages.dev/02-intro-to-java/index.html</guid>
      <description>The language basics: types, methods, collections, logic, control flow, files and a first HTTP call.</description>
    </item>
    <item>
      <title>Day 2: Intermediate Java</title>
      <link>https://learn-java-25.pages.dev/03-intermediate-java/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://learn-java-25.pages.dev/03-intermediate-java/index.html</guid>
      <description>Streams, object orientation, modules, tooling and concurrency.</description>
    </item>
    <item>
      <title>Java 25 Cheat Sheet</title>
      <link>https://learn-java-25.pages.dev/cheatsheet/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://learn-java-25.pages.dev/cheatsheet/index.html</guid>
      <description>Program and output void main() { // compact, Java 25 IO.println(&#34;Hello&#34;); var name = IO.readln(&#34;Name? &#34;); } public class Program { // classic public static void main(String[] args) { System.out.println(&#34;Hello&#34;); } } java Program.java javac Program.java java Program jshell Types int i = 42; long l = 42L; double d = 3.14; float f = 3.14f; boolean b = true; char c = &#39;A&#39;; String s = &#34;text&#34;; var x = 42; final double VAT = 0.19; Strings s.length() s.isEmpty() s.isBlank() s.strip() s.repeat(3) s.toUpperCase() s.substring(2, 5) s.charAt(0) s.indexOf(&#34;a&#34;) s.contains(&#34;a&#34;) s.startsWith(&#34;a&#34;) s.replace(&#34;a&#34;, &#34;b&#34;) s.split(&#34;,&#34;) s.equals(t) s.equalsIgnoreCase(t) s.compareTo(t) &#34;%s is %d&#34;.formatted(name, age) String.join(&#34;, &#34;, list) var block = &#34;&#34;&#34; multiline &#34;&#34;&#34;; Control flow if (a &gt; b) { … } else if (a == b) { … } else { … } var t = cond ? &#34;yes&#34; : &#34;no&#34;; var text = switch (value) { case 1, 2 -&gt; &#34;small&#34;; case Integer i when i &gt; 100 -&gt; &#34;big&#34;; case String str -&gt; &#34;text: &#34; + str; case null -&gt; &#34;nothing&#34;; default -&gt; { yield &#34;other&#34;; } }; if (o instanceof String str &amp;&amp; str.length() &gt; 3) { … } Loops for (var e : list) { … } for (var i = 0; i &lt; n; i++) { … } while (cond) { … } do { … } while (cond); break; continue; Collections var list = new ArrayList&lt;String&gt;(); list.add(&#34;a&#34;); list.get(0); list.remove(&#34;a&#34;); list.size(); list.contains(&#34;a&#34;); var fixed = List.of(&#34;a&#34;, &#34;b&#34;); var set = new HashSet&lt;String&gt;(); var map = new HashMap&lt;String, Integer&gt;(); map.put(&#34;a&#34;, 1); map.get(&#34;a&#34;); map.getOrDefault(&#34;b&#34;, 0); map.merge(&#34;a&#34;, 1, Integer::sum); map.computeIfAbsent(&#34;k&#34;, k -&gt; new ArrayList&lt;&gt;()); map.forEach((k, v) -&gt; IO.println(k + &#34;=&#34; + v)); int[] arr = {1, 2, 3}; arr.length; Arrays.sort(arr); Methods int add(int a, int b) { return a + b; } void doIt() { … } int sum(int... numbers) { … } static int help(int x) { … } Types you define record Person(String name, int age) { Person { if (age &lt; 0) throw new IllegalArgumentException(); } String initial() { return name.substring(0, 1); } } public class Account { private long balance; public Account(long start) { this.balance = start; } public long balance() { return balance; } } interface Payable { void pay(long cents); default String info() { return &#34;payment&#34;; } } sealed interface Shape permits Circle, Square {} record Circle(double r) implements Shape {} record Square(double a) implements Shape {} enum Status { OPEN, DONE } Exceptions try { risky(); } catch (IOException | NumberFormatException e) { IO.println(e.getMessage()); } finally { cleanUp(); } try (var reader = Files.newBufferedReader(path)) { … } throw new IllegalArgumentException(&#34;message&#34;); void m() throws IOException { … } Lambdas and streams Predicate&lt;String&gt; p = s -&gt; s.length() &gt; 3; Function&lt;String, Integer&gt; f = String::length; list.stream() .filter(x -&gt; x &gt; 0) .map(String::valueOf) .sorted() .distinct() .limit(10) .toList(); list.stream().count(); list.stream().anyMatch(p); list.stream().findFirst(); // Optional list.stream().mapToInt(Integer::intValue).sum(); list.stream().collect(groupingBy(Person::city)); list.stream().map(Person::name).collect(joining(&#34;, &#34;)); opt.orElse(&#34;default&#34;); opt.orElseThrow(); opt.ifPresent(IO::println); Files var p = Path.of(&#34;file.txt&#34;); Files.readString(p); Files.writeString(p, &#34;content&#34;); Files.readAllLines(p); Files.lines(p); // stream, close it Files.exists(p); Files.size(p); Files.createDirectories(p.getParent()); Date and time LocalDate.now() LocalDate.of(2026, 8, 12) LocalDateTime.now() LocalTime.of(14, 30) date.plusDays(7) date.minusMonths(1) date.format(DateTimeFormatter.ofPattern(&#34;MM/dd/yyyy&#34;)) Period.between(a, b) Duration.ofMinutes(90) Concurrency Thread.startVirtualThread(() -&gt; …); try (var ex = Executors.newVirtualThreadPerTaskExecutor()) { var f = ex.submit(() -&gt; compute()); var result = f.get(); } var counter = new AtomicInteger(); var map = new ConcurrentHashMap&lt;String, Integer&gt;(); New in Java 25 Feature What it means compact source files + instance main void main() without a class java.lang.IO IO.println, IO.readln, no import module imports import module java.base; flexible constructor bodies code before super(...) scoped values context instead of ThreadLocal structured concurrency (preview) StructuredTaskScope primitive patterns (preview) case int i in switch Commands java --version jshell javadoc File.java jar --create --file x.jar -C out . mvn test mvn package ./gradlew build ./gradlew run java --enable-preview --source 25 File.java</description>
    </item>
    <item>
      <title>Further Resources</title>
      <link>https://learn-java-25.pages.dev/resources/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://learn-java-25.pages.dev/resources/index.html</guid>
      <description>Official Java 25 documentation — language spec, tools, migration notes API docs — learning to search these quickly is a skill of its own JEP index — every language feature has a proposal explaining the why dev.java — tutorials from the OpenJDK team inside.java — blog and podcast Java 25 features JEP Topic 512 compact source files and instance main methods 511 module import declarations 513 flexible constructor bodies 506 scoped values 505 structured concurrency (preview) 507 primitive types in patterns (preview) 502 stable values (preview) Tools Eclipse Temurin — JDK builds SDKMAN! — manage several JDKs start.spring.io — Spring Boot project generator MVN Repository — find library coordinates Java Almanac — what changed between versions Practice Exercism Java track — exercises with human feedback Advent of Code — great for streams and data structures CodingBat — many small drills Your own project — one CLI tool you actually use beats a hundred exercises Books Effective Java (Joshua Bloch) — best practices, read it once the basics stick Java by Comparison — before/after snippets, ideal right after a beginner course Modern Java in Action — streams, lambdas, functional style Java Concurrency in Practice — older, but the concepts still hold Community Local Java User Groups — most cities have one, talks are usually free Conference talks from JavaOne, Devoxx and JCon are on YouTube Stack Overflow — always check the date; a lot of it describes Java 8 Tip Check the publication year of anything you read. Java changed a lot since 8 — plenty of “this is how you do it” answers are now needlessly complicated.</description>
    </item>
  </channel>
</rss>