add new package

This commit is contained in:
YuCheng Hu
2024-04-30 11:54:43 -04:00
parent 6b33c0d65d
commit 99259d231b
291 changed files with 7240 additions and 0 deletions
@@ -0,0 +1,24 @@
package com.baeldung.adapter;
import java.util.Enumeration;
import java.util.Iterator;
public class IteratorAdapter<E> implements Iterator<E> {
private Enumeration<E> enumeration;
public IteratorAdapter(Enumeration<E> enumeration) {
this.enumeration = enumeration;
}
@Override
public boolean hasNext() {
return enumeration.hasMoreElements();
}
@Override
public E next() {
return enumeration.nextElement();
}
}
@@ -0,0 +1,29 @@
package com.baeldung.adapter;
import java.util.Iterator;
import java.util.StringTokenizer;
public class StringTokenizerIteratorAdapter extends StringTokenizer implements Iterator<String> {
public StringTokenizerIteratorAdapter(final String str, final String delim, final boolean returnDelims) {
super(str, delim, returnDelims);
}
public StringTokenizerIteratorAdapter(final String str, final String delim) {
super(str, delim);
}
public StringTokenizerIteratorAdapter(final String str) {
super(str);
}
@Override
public boolean hasNext() {
return hasMoreTokens();
}
@Override
public String next() {
return nextToken();
}
}
@@ -0,0 +1,5 @@
package com.baeldung.pipeline.immutable;
public interface Pipe<IN, OUT> {
OUT process(IN input);
}
@@ -0,0 +1,37 @@
package com.baeldung.pipeline.immutable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class Pipeline<IN, OUT> {
private Collection<Pipe<?, ?>> pipes;
private Pipeline(Pipe<IN, OUT> pipe) {
pipes = Collections.singletonList(pipe);
}
private Pipeline(Collection<Pipe<?, ?>> pipes) {
this.pipes = new ArrayList<>(pipes);
}
public static <IN, OUT> Pipeline<IN, OUT> of(Pipe<IN, OUT> pipe) {
return new Pipeline<>(pipe);
}
public <NEW_OUT> Pipeline<IN, NEW_OUT> withNextPipe(Pipe<OUT, NEW_OUT> pipe) {
final ArrayList<Pipe<?, ?>> newPipes = new ArrayList<>(pipes);
newPipes.add(pipe);
return new Pipeline<>(newPipes);
}
public OUT process(IN input) {
Object output = input;
for (final Pipe pipe : pipes) {
output = pipe.process(output);
}
return (OUT) output;
}
}
@@ -0,0 +1,9 @@
package com.baeldung.pipeline.pipes;
public interface Pipe<IN, OUT> {
OUT process(IN input);
default <NEW_OUT> Pipe<IN, NEW_OUT> add(Pipe <OUT, NEW_OUT> pipe) {
return input -> pipe.process(process(input));
}
}
@@ -0,0 +1,9 @@
# Root logger
log4j.rootLogger=INFO, file, stdout
# Write to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
@@ -0,0 +1,34 @@
package com.baeldung.adapter;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import org.junit.jupiter.api.Test;
class IteratorAdapterUnitTest {
public static final String STRING_DATA = "Welcome to baeldung.com";
private final StringTokenizer tokenizer = new StringTokenizer(STRING_DATA);
private final Iterator<String> tokenizerAdapter = new StringTokenizerIteratorAdapter(STRING_DATA);
private final List<String> expectedTokensForString = Arrays.asList("Welcome", "to", "baeldung.com");
@Test
void givenTokenizer_thenAdapterProducesCorrectResult() {
List<String> actualTokens = new ArrayList<>();
new IteratorAdapter(tokenizer).forEachRemaining(s -> actualTokens.add((String) s));
assertEquals(expectedTokensForString, actualTokens);
}
@Test
void givenTokenizerAdapter_thenIteratorProducesCorrectResult() {
List<String> actualTokens = new ArrayList<>();
tokenizerAdapter.forEachRemaining(actualTokens::add);
assertEquals(expectedTokensForString, actualTokens);
}
}
@@ -0,0 +1,22 @@
package com.baeldung.pipeline;
import static org.junit.jupiter.api.Assertions.*;
import java.util.function.BiFunction;
import java.util.function.Function;
import org.junit.jupiter.api.Test;
class BiFunctionPipelineUnitTest {
@Test
void whenCombiningFunctionAndBiFunctions_andInitializingPipeline_thenResultIsCorrect() {
BiFunction<Integer, Integer, Integer> add = Integer::sum;
BiFunction<Integer, Integer, Integer> mul = (a, b) -> a * b;
Function<Integer, String> toString = Object::toString;
BiFunction<Integer, Integer, String> pipeline = add.andThen(a -> mul.apply(a, 2))
.andThen(toString);
String result = pipeline.apply(1, 2);
String expected = "6";
assertEquals(expected, result);
}
}
@@ -0,0 +1,21 @@
package com.baeldung.pipeline;
import static org.junit.jupiter.api.Assertions.*;
import java.util.function.Function;
import org.junit.jupiter.api.Test;
class FunctionPipelineUnitTest {
@Test
void whenCombiningThreeFunctions_andInitializingPipeline_thenResultIsCorrect() {
Function<Integer, Integer> square = s -> s * s;
Function<Integer, Integer> half = s -> s / 2;
Function<Integer, String> toString = Object::toString;
Function<Integer, String> pipeline = square.andThen(half)
.andThen(toString);
String result = pipeline.apply(5);
String expected = "12";
assertEquals(expected, result);
}
}
@@ -0,0 +1,20 @@
package com.baeldung.pipeline;
import static org.assertj.core.api.Assertions.assertThat;
import com.baeldung.pipeline.pipes.Pipe;
import org.junit.jupiter.api.Test;
class PipeUnitTest {
@Test
void whenCombiningThreePipes_andInitializingPipeline_thenResultIsCorrect() {
Pipe<Integer, Integer> square = s -> s * s;
Pipe<Integer, Integer> half = s -> s / 2;
Pipe<Integer, String> toString = Object::toString;
Pipe<Integer, String> pipeline = square.add(half).add(toString);
String result = pipeline.process(5);
String expected = "12";
assertThat(result).isEqualTo(expected);
}
}
@@ -0,0 +1,24 @@
package com.baeldung.pipeline;
import static org.assertj.core.api.Assertions.assertThat;
import com.baeldung.pipeline.immutable.Pipe;
import com.baeldung.pipeline.immutable.Pipeline;
import org.junit.jupiter.api.Test;
class PipelineUnitTest {
@Test
void whenCombiningThreePipes_andInitializingPipeline_thenResultIsCorrect() {
Pipe<Integer, Integer> square = s -> s * s;
Pipe<Integer, Integer> half = s -> s / 2;
Pipe<Integer, String> toString = Object::toString;
Pipeline<Integer, Integer> squarePipeline = Pipeline.of(square);
Pipeline<Integer, Integer> squareAndHalfPipeline = squarePipeline.withNextPipe(half);
Pipeline<Integer, String> squareHalfAndStringPipeline = squareAndHalfPipeline.withNextPipe(toString);
String result = squareHalfAndStringPipeline.process(5);
String expected = "12";
assertThat(result).isEqualTo(expected);
}
}