// VIM_TEST_SETUP let g:java_highlight_functions = 'style' import java.lang.annotation.ElementType; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Predicate; class LambdaExpressionsTests // JDK 21+. { void test() { // Schönfinkel's functions. I i = x -> x; C c = x -> y -> x; T t = f -> y -> x -> f.apply(x).apply(y); Z z = f -> g -> x -> f.apply(g.apply(x)); S s = f -> g -> x -> f.apply(x) .apply(g.apply(x)); I i01 = (var x) -> x; I i02 = (@Taggable var x) -> x; I i03 = (@Taggable @Taggable var x) -> x; I i04 = (final var x) -> x; I i05 = (@Taggable final var x) -> x; I i06 = (@Taggable @Taggable final var x) -> x; I i07 = (I1 x) -> x; I i08 = (@Taggable I1 x) -> x; I i09 = (@Taggable @Taggable I1 x) -> x; I i10 = (final I1 x) -> x; I i11 = (@Taggable final I1 x) -> x; I i12 = (@Taggable @Taggable final I1 x) -> x; I ii01 = (I1... x) -> x; I ii02 = (@Taggable I1... x) -> x; I ii03 = (@Taggable @Taggable I1... x) -> x; I ii04 = (final I1... x) -> x; I ii05 = (@Taggable final I1... x) -> x; I ii06 = (@Taggable @Taggable final I1... x) -> x; BinaryOperator leftConst01 = (var x, var y) -> x; BinaryOperator leftConst02 = (@Taggable var x, @Taggable var y) -> x; BinaryOperator leftConst03 = (@Taggable @Taggable var x, @Taggable @Taggable var y) -> x; BinaryOperator leftConst04 = (final var x, final var y) -> x; BinaryOperator leftConst05 = (@Taggable final var x, @Taggable final var y) -> x; BinaryOperator leftConst06 = (@Taggable @Taggable final var x, @Taggable @Taggable final var y) -> x; BinaryOperator leftConst07 = (I1 x, I1 y) -> x; BinaryOperator leftConst08 = (@Taggable I1 x, @Taggable I1 y) -> x; BinaryOperator leftConst09 = (@Taggable @Taggable I1 x, @Taggable @Taggable I1 y) -> x; BinaryOperator leftConst10 = (final I1 x, final I1 y) -> x; BinaryOperator leftConst11 = (@Taggable final I1 x, @Taggable final I1 y) -> x; BinaryOperator leftConst12 = (@Taggable @Taggable final I1 x, @Taggable @Taggable final I1 y) -> x; Runnable noOp = () -> {}; BinaryOperator leftConst = (x, y) -> x; I id1 = (x) -> (x); @SuppressWarnings("unchecked") I id2 = ((I>) (I) (Function x) -> x).apply(switch (0) { case ((int) (byte) 1) -> (I1 x) -> x; default -> (@Taggable I1 x) -> x; }); C const1 = (x) -> (y) -> (x); C const2 = switch(switch ("") { case "->"->"(s)->(s)"; default->"default"; }) { case ("->")->(var x)->(var y)->(x); default->(@Taggable var x)->(@Taggable var y) ->(x); }; } @java.lang.annotation.Target(ElementType.PARAMETER) @java.lang.annotation.Repeatable(Taggables.class) @interface Taggable { String[] value() default ""; } @java.lang.annotation.Target(ElementType.PARAMETER) @interface Taggables { Taggable[] value(); } interface I extends Function { } interface C extends Function> { } interface T extends Function>, Function>> { } interface Z extends Function, Function, Function>> { } interface S extends Function>, Function, Function>> { } static void echo(Object o) { System.out.println(o); } static { enum Letters { OTHER, ALPHA, BETA } Letters other = Letters.OTHER; switch (other) { case Letters alpha when Letters.ALPHA == alpha: { echo(alpha); break; } case Letters beta when Letters.BETA == beta: { echo(beta); break; } default: { echo(other); } } echo(switch (other) { case Letters alpha when Letters.ALPHA == alpha -> alpha; case Letters beta when Letters.BETA == beta -> beta; default -> other; }); switch (null) { case String str when !"".equals(switch (str) { case String str_ when Predicate.not(text -> !text.isEmpty()) .test(str_) -> ""; case String str_ -> str_; }): { echo(str); break; } case null: default: { echo("Other"); } }; echo(switch (null) { case String str when !"".equals( switch (str) { case String str_ when Predicate.not(text -> !text.isEmpty()) .test(str_) -> ""; case String str_ -> str_; }) -> str; case null, default -> "Other"; }); } }