diff --git a/core-java-modules/core-java-22/pom.xml b/core-java-modules/core-java-22/pom.xml new file mode 100644 index 000000000000..a3ae23f63d45 --- /dev/null +++ b/core-java-modules/core-java-22/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + core-java-22 + + + + 22 + 22 + UTF-8 + 22 + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 22 + 22 + --enable-preview + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/ImplicitClassDeclaration.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/ImplicitClassDeclaration.java new file mode 100644 index 000000000000..1c2b7655ae7a --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/ImplicitClassDeclaration.java @@ -0,0 +1,8 @@ +void main() { + System.out.println("This is an implicitly declared class without any constructs"); + + int x = 165; + int y = 100; + + System.out.println(y + x); +} \ No newline at end of file diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/MainApp.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/MainApp.java new file mode 100644 index 000000000000..5b596b8698c7 --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/MainApp.java @@ -0,0 +1,9 @@ +package com.baeldung.javafeatures; + +public class MainApp { + public static void main(String[] args) { + System.out.println("Hello"); + MultiFileExample mm = new MultiFileExample(); + mm.ping(args[0]); + } +} diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/MemoryAPIExample.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/MemoryAPIExample.java new file mode 100644 index 000000000000..1acb6e9d1d92 --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/MemoryAPIExample.java @@ -0,0 +1,30 @@ +package com.baeldung.javafeatures; + +import static java.lang.foreign.FunctionDescriptor.*; + +import java.lang.foreign.Arena; +import java.lang.foreign.FunctionDescriptor; +import java.lang.foreign.Linker; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.SymbolLookup; +import java.lang.foreign.ValueLayout; +import java.lang.invoke.MethodHandle; + +public class MemoryAPIExample { +public long getLengthUsingNativeMethod(String string) throws Throwable { + SymbolLookup stdlib = Linker.nativeLinker().defaultLookup(); + MethodHandle strlen = + Linker.nativeLinker() + .downcallHandle( + stdlib.find("strlen").orElseThrow(), + of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS)); + + try (Arena offHeap = Arena.ofConfined()) { + MemorySegment str = offHeap.allocateFrom(string); + + long len = (long) strlen.invoke(str); + System.out.println("Finding String length using strlen function: " + len); + return len; + } +} +} diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/MultiFileExample.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/MultiFileExample.java new file mode 100644 index 000000000000..ecef5cd14950 --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/MultiFileExample.java @@ -0,0 +1,7 @@ +package com.baeldung.javafeatures; + +public class MultiFileExample { + public void ping(String s) { + System.out.println("Ping from Second File " + s); + } +} diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/ScopedValueExample.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/ScopedValueExample.java new file mode 100644 index 000000000000..6da11b81c9e2 --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/ScopedValueExample.java @@ -0,0 +1,40 @@ +package com.baeldung.javafeatures; + +import java.util.Random; + +public class ScopedValueExample { + public final static ScopedValue LOGGED_IN_USER = ScopedValue.newInstance(); + + public void serve(Request request) { + User loggedInUser = authenticateUser(request); + ScopedValue.where(LOGGED_IN_USER, loggedInUser) + .run(() -> processRequest(request)); + } + + private User authenticateUser(Request request) { + return new User(new Random().nextInt(100), STR."User\{new Random().nextInt()}"); + } + + private void processRequest(Request request) { + System.out.println("Processing request :: " + ScopedValueExample.LOGGED_IN_USER.get() + .toString()); + } +} + +class User { + private int id; + private String userName; + + public User(int id, String userName) { + this.id = id; + this.userName = userName; + } + + public String toString() { + return STR."User :: \{this.id}"; + } +} + +class Request { + +} diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/StreamGatherersExample.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/StreamGatherersExample.java new file mode 100644 index 000000000000..f8b51cdc3d61 --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/StreamGatherersExample.java @@ -0,0 +1,14 @@ +package com.baeldung.javafeatures; + +import java.util.List; +import java.util.stream.Gatherers; + +public class StreamGatherersExample { + public List> gatherIntoWindows(List countries) { + List> windows = countries.stream() + .gather(Gatherers.windowSliding(3)) + .toList(); + return windows; + } + +} diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/UnnamedExpressions.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/UnnamedExpressions.java new file mode 100644 index 000000000000..a481f47285e9 --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/UnnamedExpressions.java @@ -0,0 +1,62 @@ +package com.baeldung.javafeatures; + +import static java.lang.StringTemplate.STR; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +public class UnnamedExpressions { + private Logger LOGGER = Logger.getLogger(String.valueOf(UnnamedExpressions.class)); + + public int unnamedExpressionExampleUsingException(int someNumber) { + int divided = 0; + try { + divided = someNumber / 0; + } catch (ArithmeticException _) { + System.err.println("Division by zero"); + } + return divided; + } + + public Object unnamedExpressionsExampleUsingSwitch(Object obj) { + switch (obj) { + case Integer _ -> System.out.println("Is an integer"); + case Float _ -> System.out.println("Is a float"); + case String _ -> System.out.println("Is a String"); + default -> System.out.println("Default"); + } + ; + return obj; + } + + public boolean unnamedExpressionForTryWithResources() { + String url = "localhost"; + String user = "user"; + String pwd = "password"; + try (Connection _ = DriverManager.getConnection(url, user, pwd)) { + LOGGER.info(STR.""" + DB Connection successful + URL = \{url} + usr = \{user} + pwd = \{pwd}"""); + } catch (SQLException e) { + LOGGER.warning("Exception"); + } + return true; + } + + public Map> unnamedExpressionForLambda() { + Map> map = new HashMap<>(); + map.computeIfAbsent("v1", _ -> new ArrayList<>()) + .add("0.1"); + return map; + } + +} + diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/classfile/ClassFileDriver.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/classfile/ClassFileDriver.java new file mode 100644 index 000000000000..01eab3b4d5f7 --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/classfile/ClassFileDriver.java @@ -0,0 +1,28 @@ +package com.baeldung.javafeatures.classfile; + +import java.io.IOException; +import java.lang.classfile.ClassElement; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassModel; +import java.lang.classfile.MethodModel; +import java.nio.file.Files; +import java.nio.file.Path; + +public class ClassFileDriver { + public Path updateClass() throws IOException { + final String PREFIX = "test_"; + final Path PATH = Path.of("src/main/java/com/baeldung/javafeatures/classfile/ClassFileExample.class"); + ClassFile cf = ClassFile.of(); + ClassModel classModel = cf.parse(PATH); + byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { + for (ClassElement ce : classModel) { + if (!(ce instanceof MethodModel mm && mm.methodName() + .stringValue() + .startsWith(PREFIX))) { + classBuilder.with(ce); + } + } + }); + return Files.write(PATH, newBytes); + } +} diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/classfile/ClassFileExample.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/classfile/ClassFileExample.java new file mode 100644 index 000000000000..b5676d5582d5 --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/classfile/ClassFileExample.java @@ -0,0 +1,16 @@ +package com.baeldung.javafeatures.classfile; + +public class ClassFileExample { + public void doSomething() { + System.out.println("Do something here"); + } + + public void doSomething2() { + System.out.println("Do something here as well"); + } + + public void test_something() { + System.out.println("Test method"); + } + +} diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/shapes/Circle.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/shapes/Circle.java new file mode 100644 index 000000000000..6927028b9ce0 --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/shapes/Circle.java @@ -0,0 +1,19 @@ +package com.baeldung.javafeatures.shapes; + +public class Circle extends Shape { + int sides; + int length; + + Circle(int sides, int length) { + if (sides != 0 && length > 0) { + throw new IllegalArgumentException("Cannot form circle"); + } + super(sides, length); + } + + @Override + int getArea() { + return (int) (this.length * this.length * 3.14); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/shapes/Shape.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/shapes/Shape.java new file mode 100644 index 000000000000..39c42167bccc --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/shapes/Shape.java @@ -0,0 +1,12 @@ +package com.baeldung.javafeatures.shapes; + +public abstract class Shape { + private int sides; + private int length; + Shape(int sides, int length) { + this.sides = sides; + this.length = length; + } + + abstract int getArea(); +} diff --git a/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/shapes/Square.java b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/shapes/Square.java new file mode 100644 index 000000000000..e1a9b7962dda --- /dev/null +++ b/core-java-modules/core-java-22/src/main/java/com/baeldung/javafeatures/shapes/Square.java @@ -0,0 +1,22 @@ +package com.baeldung.javafeatures.shapes; + +public class Square extends Shape { + int sides; + int length; + + public Square(int sides, int length) { + if (sides != 4 && length <= 0) { + throw new IllegalArgumentException("Cannot form Square"); + } + super(sides, length); + } + + @Override + int getArea() { + return 4 * length; + } + + public String whoAmI() { + return "I am a square"; + } +} diff --git a/core-java-modules/core-java-22/src/test/java/com/baeldung/javafeatures/Java22ExamplesUnitTest.java b/core-java-modules/core-java-22/src/test/java/com/baeldung/javafeatures/Java22ExamplesUnitTest.java new file mode 100644 index 000000000000..7abd223dfbe3 --- /dev/null +++ b/core-java-modules/core-java-22/src/test/java/com/baeldung/javafeatures/Java22ExamplesUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.javafeatures; + +import java.io.IOException; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import com.baeldung.javafeatures.classfile.ClassFileDriver; + +public class Java22ExamplesUnitTest { + + @Test + public void givenJava22_whenUsingLanguagePatterns_thenReturnResult() { + UnnamedExpressions um = new UnnamedExpressions(); + Assert.assertEquals(0, um.unnamedExpressionExampleUsingException(100)); + Assert.assertEquals(123, um.unnamedExpressionsExampleUsingSwitch(123)); + Assert.assertTrue(um.unnamedExpressionForTryWithResources()); + Assert.assertNotNull(um.unnamedExpressionForLambda()); + } + + @Test + public void givenJava22_whenUsingClassFileAPI_thenReturnUpdatedClass() throws IOException { + ClassFileDriver classFileDriver = new ClassFileDriver(); + Assert.assertNotNull(classFileDriver.updateClass()); + } + + @Test + public void givenJava22_whenUsingForeignAPI_thenReturnLengthUsingCFunction() throws Throwable { + MemoryAPIExample mp = new MemoryAPIExample(); + Assert.assertEquals(11, mp.getLengthUsingNativeMethod("Hello world")); + } + + @Test + public void givenJava22_whenUsingStreamGatherer_thenReturnCustomList() { + Assert.assertNotNull(new StreamGatherersExample().gatherIntoWindows(List.of("India", "Poland", "UK", "Australia", "USA", "Netherlands"))); + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 1344b3af2349..d63337eaea53 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -228,6 +228,7 @@ java-spi java-websocket core-java-8-datetime-3 +