diff --git a/2-0-data-structures-and-algorithms/2-2-3-linked-queue/src/test/java/com/bobocode/cs/LinkedQueueTest.java b/2-0-data-structures-and-algorithms/2-2-3-linked-queue/src/test/java/com/bobocode/cs/LinkedQueueTest.java index 91a6e2616..88c1a7d9d 100644 --- a/2-0-data-structures-and-algorithms/2-2-3-linked-queue/src/test/java/com/bobocode/cs/LinkedQueueTest.java +++ b/2-0-data-structures-and-algorithms/2-2-3-linked-queue/src/test/java/com/bobocode/cs/LinkedQueueTest.java @@ -62,7 +62,7 @@ void createNodeClass() { @Test @Order(2) - void chekFieldsNameInNodeClass() { + void checkFieldsNameInNodeClass() { Class innerClass = getInnerStaticNodeClass(); boolean hasElementField = hasField(innerClass, ELEMENT_FIELD); boolean hasNodeField = hasField(innerClass, NODE_FIELD); @@ -104,16 +104,19 @@ void addFillsQueueWhenItIsEmpty() { @Order(5) void addFillsQueueWhenItIsNotEmpty() { addIntElementToQueue(12); + addIntElementToQueue(13); integerQueue.add(111); int size = getInternalSize(); boolean isEmpty = isEmptyQueue(); Integer firstElement = (Integer) pollElementFromQueue(); Integer secondElement = (Integer) pollElementFromQueue(); + Integer tailValue = (Integer) getNodeValue(TAIL_FIELD); - assertThat(size).isEqualTo(2); + assertThat(size).isEqualTo(3); assertThat(isEmpty).isEqualTo(false); assertThat(firstElement).isEqualTo(12); - assertThat(secondElement).isEqualTo(111); + assertThat(secondElement).isEqualTo(13); + assertThat(tailValue).isEqualTo(111); } @Test @@ -363,4 +366,12 @@ private Field getAccessibleFieldByPredicate(Object object, Predicate pred field.setAccessible(true); return field; } + + @SneakyThrows + private Object getNodeValue(Predicate predicate) { + Object field = getAccessibleFieldByPredicate(integerQueue, predicate).get(integerQueue); + final Field value = getAccessibleFieldByPredicate(field, ELEMENT_FIELD); + value.setAccessible(true); + return value.get(field); + } } diff --git a/lesson-demo/pom.xml b/lesson-demo/pom.xml index 0bd7ccdcf..a51f85952 100644 --- a/lesson-demo/pom.xml +++ b/lesson-demo/pom.xml @@ -17,6 +17,12 @@ java-fundamentals-util 1.0-SNAPSHOT + + + org.springframework + spring-context + 5.3.22 + \ No newline at end of file diff --git a/lesson-demo/src/main/java/com/bobocode/DemoApp.java b/lesson-demo/src/main/java/com/bobocode/DemoApp.java index f27749017..bf6bca648 100644 --- a/lesson-demo/src/main/java/com/bobocode/DemoApp.java +++ b/lesson-demo/src/main/java/com/bobocode/DemoApp.java @@ -1,6 +1,18 @@ package com.bobocode; +import java.util.List; + public class DemoApp { public static void main(String[] args) { + List wordList = List.of("Hello", "Hey"); + System.out.println(wordList.getClass().getComponentType()); // 👈 + + String[] wordArray = wordList.toArray(new String[1]); + System.out.println(wordArray.getClass().getComponentType()); } + +// public static T[] createGenericArray(int size) { +// return new T[size]; // it's not possible to create a generic array +// } + } diff --git a/lesson-demo/src/main/java/com/bobocode/FunctionalProgrammingDemoApp.java b/lesson-demo/src/main/java/com/bobocode/FunctionalProgrammingDemoApp.java new file mode 100644 index 000000000..f65e938b8 --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/FunctionalProgrammingDemoApp.java @@ -0,0 +1,29 @@ +package com.bobocode; + +import java.util.Stack; +import java.util.stream.Collector; +import java.util.stream.Stream; + +public class FunctionalProgrammingDemoApp { + public static void main(String[] args) { + Stack wordsStack = Stream.of("Hello", "Hey") + .collect(toStack()); + + while (!wordsStack.isEmpty()) { + System.out.println(wordsStack.pop()); + } + + } + + private static Collector> toStack() { + return Collector.of( + Stack::new, + Stack::push, + (stack1, stack2) -> { + stack2.forEach(stack1::push); + return stack1; + } + ); + } + +} diff --git a/lesson-demo/src/main/java/com/bobocode/SpringDemoApp.java b/lesson-demo/src/main/java/com/bobocode/SpringDemoApp.java new file mode 100644 index 000000000..14cca9fab --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/SpringDemoApp.java @@ -0,0 +1,32 @@ +package com.bobocode; + +import com.bobocode.service.ConferenceService; +import com.bobocode.service.TalkingService; +import lombok.SneakyThrows; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Map; + +public class SpringDemoApp { + @SneakyThrows + public static void main(String[] args) { + + var context = new AnnotationConfigApplicationContext("com.bobocode.service"); + var conferenceService = context.getBean(ConferenceService.class); + // how spring works + var field = conferenceService.getClass().getDeclaredField("talkingServiceList"); + ParameterizedType genericType = (ParameterizedType) field.getGenericType(); + Type actualTypeArgument = genericType.getActualTypeArguments()[0]; + Class talkingServiceClass = Class.forName(actualTypeArgument.getTypeName()); + System.out.println(talkingServiceClass); + Map beanMaps = context.getBeansOfType(talkingServiceClass); + beanMaps.values().stream() + .map(bean -> (TalkingService)bean) + .forEach(TalkingService::talk); + + + } + +} diff --git a/lesson-demo/src/main/java/com/bobocode/service/ConferenceService.java b/lesson-demo/src/main/java/com/bobocode/service/ConferenceService.java new file mode 100644 index 000000000..6d0e85b74 --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/service/ConferenceService.java @@ -0,0 +1,17 @@ +package com.bobocode.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ConferenceService { + private final List talkingServiceList; + + public void runConference() { + talkingServiceList.forEach(TalkingService::talk); + } +} diff --git a/lesson-demo/src/main/java/com/bobocode/service/MadService.java b/lesson-demo/src/main/java/com/bobocode/service/MadService.java new file mode 100644 index 000000000..25a720afe --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/service/MadService.java @@ -0,0 +1,11 @@ +package com.bobocode.service; + +import org.springframework.stereotype.Service; + +@Service +public class MadService { + + public void talk() { + System.out.println("I am mad!"); + } +} diff --git a/lesson-demo/src/main/java/com/bobocode/service/TalkingService.java b/lesson-demo/src/main/java/com/bobocode/service/TalkingService.java new file mode 100644 index 000000000..51e53b441 --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/service/TalkingService.java @@ -0,0 +1,5 @@ +package com.bobocode.service; + +public interface TalkingService { + void talk(); +} diff --git a/lesson-demo/src/main/java/com/bobocode/service/impl/HelloTalkingService.java b/lesson-demo/src/main/java/com/bobocode/service/impl/HelloTalkingService.java new file mode 100644 index 000000000..f20ea3a98 --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/service/impl/HelloTalkingService.java @@ -0,0 +1,12 @@ +package com.bobocode.service.impl; + +import com.bobocode.service.TalkingService; +import org.springframework.stereotype.Service; + +@Service +public class HelloTalkingService implements TalkingService { + @Override + public void talk() { + System.out.println("Hello"); + } +} diff --git a/lesson-demo/src/main/java/com/bobocode/service/impl/HeyTalkingService.java b/lesson-demo/src/main/java/com/bobocode/service/impl/HeyTalkingService.java new file mode 100644 index 000000000..2e7bf4bad --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/service/impl/HeyTalkingService.java @@ -0,0 +1,12 @@ +package com.bobocode.service.impl; + +import com.bobocode.service.TalkingService; +import org.springframework.stereotype.Service; + +@Service +public class HeyTalkingService implements TalkingService { + @Override + public void talk() { + System.out.println("Hey"); + } +}