From 48dd58bbf7e38f6a660b28c5d161cea3d7fb95ca Mon Sep 17 00:00:00 2001 From: mperor Date: Sat, 11 Jan 2025 13:00:50 +0100 Subject: [PATCH] Create decorator using lambda expression --- .../structural/decorator/TextProcessor.java | 25 ++++++++++++++++++ .../decorator/TextProcessorTest.java | 26 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java create mode 100644 DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java new file mode 100644 index 0000000..6ff6301 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java @@ -0,0 +1,25 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator; + +import java.util.Arrays; +import java.util.function.UnaryOperator; + +@FunctionalInterface +public interface TextProcessor extends UnaryOperator { + + default TextProcessor chain(TextProcessor after) { + return input -> after.apply(this.apply(input)); + } + + static TextProcessor identity() { + return s -> s; + } + + static TextProcessor of(TextProcessor processor) { + return processor; + } + + static TextProcessor of(TextProcessor... processors) { + return Arrays.stream(processors) + .reduce(TextProcessor.identity(), TextProcessor::chain); + } +} \ No newline at end of file diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java new file mode 100644 index 0000000..dcd864e --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java @@ -0,0 +1,26 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TextProcessorTest { + + @Test + public void shouldAllowToCreateTextProcessorAsChainOfFunctions() { + Assertions.assertEquals("prefix@Hello World@suffix", + TextProcessor.of(String::strip) + .chain(s -> "prefix" + s) + .chain(s -> s + "suffix") + .apply(" @Hello World@") + ); + + Assertions.assertEquals("HEX", + TextProcessor.of( + String::toUpperCase, + s -> s.replace("L", "X"), + s -> s.substring(0, 3) + ).apply("Hello World") + ); + } + +}