diff --git a/0-0-intro/src/main/java/com/bobocode/intro/ExerciseIntroduction.java b/0-0-intro/src/main/java/com/bobocode/intro/ExerciseIntroduction.java
index 35d925636..e0d0514d2 100644
--- a/0-0-intro/src/main/java/com/bobocode/intro/ExerciseIntroduction.java
+++ b/0-0-intro/src/main/java/com/bobocode/intro/ExerciseIntroduction.java
@@ -1,6 +1,6 @@
package com.bobocode.intro;
-import com.bobocode.util.ExerciseNotCompletedException;
+import java.util.Base64;
/**
* Welcome! This is an introduction exercise that will show you a simple example of Bobocode exercises.
@@ -23,23 +23,13 @@ public class ExerciseIntroduction {
* @return "The key to efficient learning is practice!"
*/
public String getWelcomeMessage() {
- // todo: implement a method and return a message according to javadoc
- throw new ExerciseNotCompletedException();
+ return "The key to efficient learning is practice!";
}
/**
- * Method encodeMessage accepts one {@link String} parameter and returns encoded {@link String}.
- *
- * PLEASE NOTE THAT YOU WILL GET STUCK ON THIS METHOD INTENTIONALLY! ;)
- *
- * Every exercise has a completed solution that is stored in the branch "completed". So in case you got stuck
- * and don't know what to do, go check out completed solution.
*
- * @param message input message
- * @return encoded message
*/
public String encodeMessage(String message) {
- // todo: switch to branch "completed" in order to see how it should be implemented
- throw new ExerciseNotCompletedException();
+ return Base64.getEncoder().encodeToString(message.getBytes());
}
}
diff --git a/1-0-java-basics/1-3-0-hello-generics/src/main/java/com/bobocode/basics/Box.java b/1-0-java-basics/1-3-0-hello-generics/src/main/java/com/bobocode/basics/Box.java
index 5a2d860ee..0a1630d53 100644
--- a/1-0-java-basics/1-3-0-hello-generics/src/main/java/com/bobocode/basics/Box.java
+++ b/1-0-java-basics/1-3-0-hello-generics/src/main/java/com/bobocode/basics/Box.java
@@ -5,20 +5,19 @@
* is flexible, because we can store anything we want there. But it is not safe, because it requires runtime casting
* and there is no guarantee that we know the type of the stored value.
*
- * todo: refactor this class so it uses generic type "T" and run {@link com.bobocode.basics.BoxTest} to verify it
*/
-public class Box {
- private Object value;
+public class Box {
+ private T value;
- public Box(Object value) {
+ public Box(T value) {
this.value = value;
}
- public Object getValue() {
+ public T getValue() {
return value;
}
- public void setValue(Object value) {
+ public void setValue(T value) {
this.value = value;
}
}
diff --git a/1-0-java-basics/1-3-1-crazy-generics/src/main/java/com/bobocode/basics/CrazyGenerics.java b/1-0-java-basics/1-3-1-crazy-generics/src/main/java/com/bobocode/basics/CrazyGenerics.java
index 751d5899f..1b320c076 100644
--- a/1-0-java-basics/1-3-1-crazy-generics/src/main/java/com/bobocode/basics/CrazyGenerics.java
+++ b/1-0-java-basics/1-3-1-crazy-generics/src/main/java/com/bobocode/basics/CrazyGenerics.java
@@ -5,10 +5,8 @@
import lombok.Data;
import java.io.Serializable;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.function.Predicate;
/**
* {@link CrazyGenerics} is an exercise class. It consists of classes, interfaces and methods that should be updated
@@ -33,8 +31,8 @@ public class CrazyGenerics {
* @param – value type
*/
@Data
- public static class Sourced { // todo: refactor class to introduce type parameter and make value generic
- private Object value;
+ public static class Sourced { // todo: refactor class to introduce type parameter and make value generic
+ private T value;
private String source;
}
@@ -45,11 +43,10 @@ public static class Sourced { // todo: refactor class to introduce type paramete
* @param – actual, min and max type
*/
@Data
- public static class Limited {
- // todo: refactor class to introduce type param bounded by number and make fields generic numbers
- private final Object actual;
- private final Object min;
- private final Object max;
+ public static class Limited {
+ private final T actual;
+ private final T min;
+ private final T max;
}
/**
@@ -59,8 +56,8 @@ public static class Limited {
* @param – source object type
* @param - converted result type
*/
- public interface Converter { // todo: introduce type parameters
- // todo: add convert method
+ public interface Converter {
+ R convert(T value);
}
/**
@@ -70,10 +67,10 @@ public interface Converter { // todo: introduce type parameters
*
* @param – value type
*/
- public static class MaxHolder { // todo: refactor class to make it generic
- private Object max;
+ public static class MaxHolder> {
+ private T max;
- public MaxHolder(Object max) {
+ public MaxHolder(T max) {
this.max = max;
}
@@ -82,11 +79,13 @@ public MaxHolder(Object max) {
*
* @param val a new value
*/
- public void put(Object val) {
- throw new ExerciseNotCompletedException(); // todo: update parameter and implement the method
+ public void put(T val) {
+ if(val.compareTo(max)> 0) {
+ max = val;
+ }
}
- public Object getMax() {
+ public T getMax() {
return max;
}
}
@@ -97,8 +96,8 @@ public Object getMax() {
*
* @param – the type of objects that can be processed
*/
- interface StrictProcessor { // todo: make it generic
- void process(Object obj);
+ interface StrictProcessor> {
+ void process(T obj);
}
/**
@@ -108,19 +107,21 @@ interface StrictProcessor { // todo: make it generic
* @param – a type of the entity that should be a subclass of {@link BaseEntity}
* @param – a type of any collection
*/
- interface CollectionRepository { // todo: update interface according to the javadoc
- void save(Object entity);
+ interface CollectionRepository> {
+ void save(T entity);
- Collection getEntityCollection();
+ C getEntityCollection();
}
+
/**
* {@link ListRepository} extends {@link CollectionRepository} but specifies the underlying collection as
* {@link java.util.List}.
*
* @param – a type of the entity that should be a subclass of {@link BaseEntity}
*/
- interface ListRepository { // todo: update interface according to the javadoc
+ interface ListRepository extends CollectionRepository> {
+
}
/**
@@ -133,7 +134,12 @@ interface ListRepository { // todo: update interface according to the javadoc
*
* @param a type of collection elements
*/
- interface ComparableCollection { // todo: refactor it to make generic and provide a default impl of compareTo
+ interface ComparableCollection extends Collection, Comparable> {
+
+ @Override
+ default int compareTo(Collection> e) {
+ return Integer.compare(this.size(), e.size());
+ }
}
/**
@@ -147,8 +153,8 @@ static class CollectionUtil {
*
* @param list
*/
- public static void print(List list) {
- // todo: refactor it so the list of any type can be printed, not only integers
+ public static void print(List> list) {
+
list.forEach(element -> System.out.println(" – " + element));
}
@@ -160,8 +166,9 @@ public static void print(List list) {
* @param entities provided collection of entities
* @return true if at least one of the elements has null id
*/
- public static boolean hasNewEntities(Collection entities) {
- throw new ExerciseNotCompletedException(); // todo: refactor parameter and implement method
+ public static boolean hasNewEntities(Collection extends BaseEntity> entities) {
+ return entities.stream()
+ .anyMatch(e -> e.getUuid() == null);
}
/**
@@ -173,10 +180,13 @@ public static boolean hasNewEntities(Collection entities) {
* @param validationPredicate criteria for validation
* @return true if all entities fit validation criteria
*/
- public static boolean isValidCollection() {
- throw new ExerciseNotCompletedException(); // todo: add method parameters and implement the logic
+ public static boolean isValidCollection(Collection extends BaseEntity> entities,
+ Predicate super BaseEntity> validationPredicate) {
+ return entities.stream()
+ .allMatch(validationPredicate);
}
+
/**
* hasDuplicates is a generic util method checks if a list of entities contains target entity more than once.
* In other words, it checks if target entity has duplicates in the provided list. A duplicate is an entity that
@@ -187,8 +197,10 @@ public static boolean isValidCollection() {
* @param entity type
* @return true if entities list contains target entity more than once
*/
- public static boolean hasDuplicates() {
- throw new ExerciseNotCompletedException(); // todo: update method signature and implement it
+ public static boolean hasDuplicates(Collection entities, T targetEntity) {
+ return entities.stream()
+ .filter(e -> e.getUuid().equals(targetEntity.getUuid()))
+ .count()> 1;
}
/**
@@ -200,8 +212,21 @@ public static boolean hasDuplicates() {
* @param type of elements
* @return optional max value
*/
- // todo: create a method and implement its logic manually without using util method from JDK
+ public static Optional findMax(Iterable elements, Comparator super T> comparator) {
+ Iterator iterator = elements.iterator();
+ T max = iterator.next();
+
+ while (iterator.hasNext()) {
+ T current = iterator.next();
+
+ if (comparator.compare(current, max)> 0) {
+ max = current;
+ }
+ }
+
+ return Optional.of(max);
+ }
/**
* findMostRecentlyCreatedEntity is a generic util method that accepts a collection of entities and returns the
* one that is the most recently created. If collection is empty,
@@ -214,7 +239,11 @@ public static boolean hasDuplicates() {
* @param entity type
* @return an entity from the given collection that has the max createdOn value
*/
- // todo: create a method according to JavaDoc and implement it using previous method
+
+ public static T findMostRecentlyCreatedEntity(Collection entities) {
+ return findMax(entities, CREATED_ON_COMPARATOR)
+ .orElseThrow();
+ }
/**
* An util method that allows to swap two elements of any list. It changes the list so the element with the index
@@ -228,7 +257,13 @@ public static boolean hasDuplicates() {
public static void swap(List> elements, int i, int j) {
Objects.checkIndex(i, elements.size());
Objects.checkIndex(j, elements.size());
- throw new ExerciseNotCompletedException(); // todo: complete method implementation
+ swapHelper(elements, i, j);
+ }
+
+ private static void swapHelper(List elements, int i, int j) {
+ T temp = elements.get(i);
+ elements.set(i, elements.get(j));
+ elements.set(j, temp);
}
}