Guided hands-on exercises for the Java learning path on Amigoscode Academy.
Tech Stack
- Java 25
- Maven
- JUnit 5, AssertJ & Mockito (for testing exercises)
Branches
| Branch | Description |
|---|---|
main |
Base setup |
exercises |
All exercises with TODOs |
solutions |
Completed solutions |
How to Use
- Checkout the exercises branch:
- Open the project in IntelliJ IDEA
- Follow the exercises below in order - each course is a package
- Use the TODO tool window (
View > Tool Windows > TODO) to jump to exercise locations in the code - Stuck? Check the solutions branch:
Prerequisites
Java 25 is required. This project will not compile with older Java versions. Make sure you have Java 25 installed before starting.
You can check your Java version with:
Course Order
The exercises follow the Java roadmap in this recommended order:
| # | Package | Course(s) | Exercises |
|---|---|---|---|
| 1 | beginners |
Java For Beginners | 69 |
| 2 | developers |
Java For Developers | 130 |
| 3 | oop |
Object Oriented Programming | 95 |
| 4 | datastructures |
Data Structures | 99 |
| 5 | generics |
Generics | 70 |
| 6 | functionalinterfaces |
Functional Interfaces | 76 |
| 7 | streams |
Streams Essentials + Java Streams | 152 |
| 8 | testing |
Unit Testing Essentials + Unit Testing + Mockito | 126 |
| Total | 11 courses | 817 |
Exercise Breakdown
Java For Beginners (69 exercises)
| # | File | TODOs | Topic |
|---|---|---|---|
| 01 | beginners/thebasics/Variables.java |
7 | Variable declaration and data types |
| 02 | beginners/thebasics/TypeCasting.java |
6 | Implicit/explicit casting and type conversion |
| 03 | beginners/thebasics/Operators.java |
7 | Arithmetic, comparison, logical, and ternary operators |
| 04 | beginners/thebasics/StringExercises.java |
8 | String methods (length, substring, split, equals) |
| 05 | beginners/thebasics/ArrayExercises.java |
7 | Array declaration, access, iteration, and summing |
| 06 | beginners/thebasics/ConditionalStatements.java |
7 | if/else, switch statements, switch expressions |
| 07 | beginners/thebasics/LoopExercises.java |
8 | for, while, do-while, enhanced for, nested loops |
| 08 | beginners/thebasics/MethodExercises.java |
7 | Method creation, return types, overloading |
| 09 | beginners/thebasics/ScannerExercises.java |
6 | Reading user input with Scanner |
| 10 | beginners/thebasics/MiniProject.java |
6 | Simple calculator combining all concepts |
Java For Developers (130 exercises)
| # | File | TODOs | Topic |
|---|---|---|---|
| 01 | developers/loops/LoopExercises.java |
7 | Nested loops, break/continue, patterns |
| 02 | developers/conditionals/IfStatements.java |
6 | Ternary, complex conditions, switch expressions |
| 03 | developers/packages/PackageDemo.java |
5 | Imports, static imports, fully qualified names |
| 04 | developers/accessmodifiers/AccessModifiers.java |
6 | public, private, protected, default |
| 05 | developers/accessmodifiers/AccessDemo.java |
5 | Accessing modifiers from another class |
| 06 | developers/methods/MethodOverloading.java |
7 | Method overloading with different parameters |
| 07 | developers/methods/VarArgs.java |
6 | Variable-length arguments |
| 08 | developers/strings/StringMethods.java |
8 | equals, compareTo, contains, replace, split |
| 09 | developers/strings/StringBuilderExercises.java |
6 | StringBuilder operations |
| 10 | developers/dates/DateExercises.java |
7 | LocalDate, LocalDateTime, formatting, parsing |
| 11 | developers/bigdecimal/BigDecimalExercises.java |
6 | BigDecimal arithmetic and comparisons |
| 12 | developers/userinput/UserInputExercises.java |
6 | Scanner with validation |
| 13 | developers/exceptions/TryCatch.java |
7 | try-catch-finally, multi-catch, try-with-resources |
| 14 | developers/exceptions/CustomException.java |
6 | Custom checked and unchecked exceptions |
| 15 | developers/files/FileReading.java |
6 | Reading files with Files and BufferedReader |
| 16 | developers/files/FileWriting.java |
6 | Writing files with Files and BufferedWriter |
| 17 | developers/classes/ClassesAndObjects.java |
7 | Classes, constructors, toString, equals |
| 18 | developers/classes/EnumExercises.java |
6 | Enums with fields, constructors, methods |
| 19 | developers/staticmembers/StaticExercises.java |
6 | Static fields, methods, factory methods |
| 20 | developers/nullhandling/OptionalExercises.java |
7 | Optional.of, ofNullable, map, flatMap |
Object Oriented Programming (95 exercises)
| # | File | TODOs | Topic |
|---|---|---|---|
| 01 | oop/encapsulation/BankAccount.java |
7 | Private fields, getters/setters, validation |
| 02 | oop/encapsulation/ImmutablePerson.java |
6 | Immutable class with final fields |
| 03 | oop/inheritance/Animal.java |
5 | Base class with fields and methods |
| 04 | oop/inheritance/Dog.java |
6 | Extending, super(), overriding methods |
| 05 | oop/inheritance/Vehicle.java |
5 | Base class for vehicle hierarchy |
| 06 | oop/inheritance/ElectricCar.java |
6 | Extending, constructor chaining, override |
| 07 | oop/abstractclasses/Shape.java |
5 | Abstract class and abstract methods |
| 08 | oop/abstractclasses/Circle.java |
5 | Implementing abstract methods |
| 09 | oop/abstractclasses/Rectangle.java |
5 | Implementing abstract methods |
| 10 | oop/abstractclasses/Employee.java |
7 | Abstract hierarchy with polymorphism |
| 11 | oop/polymorphism/PaymentProcessor.java |
7 | Interface, multiple implementations |
| 12 | oop/polymorphism/ShapeCalculator.java |
6 | Polymorphic methods, instanceof |
| 13 | oop/dependencyinjection/NotificationService.java |
7 | Constructor injection pattern |
| 14 | oop/dependencyinjection/OrderProcessor.java |
6 | Depend on abstractions |
| 15 | oop/solid/SolidExercises.java |
8 | All 5 SOLID principles |
Data Structures (99 exercises)
| # | File | TODOs | Topic |
|---|---|---|---|
| 01 | datastructures/arrays/ArrayBasics.java |
7 | Create, fill, search, sort arrays |
| 02 | datastructures/arrays/TwoDArrays.java |
6 | 2D array traversal (matrix) |
| 03 | datastructures/arraylist/ArrayListBasics.java |
7 | Add, remove, contains, iterate |
| 04 | datastructures/arraylist/ArrayListOperations.java |
7 | Sort, reverse, max, subList, toArray |
| 05 | datastructures/stacks/StackExercises.java |
7 | Push, pop, peek, balanced brackets |
| 06 | datastructures/queues/QueueExercises.java |
7 | Queue, PriorityQueue operations |
| 07 | datastructures/linkedlists/LinkedListExercises.java |
7 | addFirst, addLast, Iterator |
| 08 | datastructures/linkedlists/LinkedListVsArrayList.java |
5 | Performance comparison |
| 09 | datastructures/sets/HashSetExercises.java |
7 | Add, contains, remove duplicates |
| 10 | datastructures/sets/TreeSetExercises.java |
6 | Sorted set, subSet, headSet |
| 11 | datastructures/maps/HashMapExercises.java |
8 | put, get, containsKey, iterate |
| 12 | datastructures/maps/HashMapWordCount.java |
6 | Word frequency counter |
| 13 | datastructures/maps/TreeMapExercises.java |
6 | Sorted map operations |
| 14 | datastructures/maps/MapAdvanced.java |
6 | computeIfAbsent, merge, Map.of |
| 15 | datastructures/challenge/DataStructureChallenge.java |
7 | Mini project with multiple structures |
Generics (70 exercises)
| # | File | TODOs | Topic |
|---|---|---|---|
| 01 | generics/classcastexception/ClassCastProblem.java |
5 | Why generics are needed |
| 02 | generics/typeparameters/TypeParameterBasics.java |
6 | Generic class Container<T> |
| 03 | generics/genericclasses/Box.java |
6 | Generic Box<T> class |
| 04 | generics/genericclasses/Pair.java |
7 | Two type parameters Pair<K,V> |
| 05 | generics/genericmethods/GenericMethods.java |
7 | Generic static methods |
| 06 | generics/genericmethods/GenericSwap.java |
5 | Generic swap and reverse |
| 07 | generics/boundedtypes/UpperBound.java |
7 | <T extends Number> |
| 08 | generics/boundedtypes/MultipleBounds.java |
5 | Multiple type bounds |
| 09 | generics/wildcards/UnboundedWildcard.java |
5 | List<?> |
| 10 | generics/wildcards/UpperBoundedWildcard.java |
6 | <? extends Number> |
| 11 | generics/wildcards/LowerBoundedWildcard.java |
6 | <? super Integer> |
| 12 | generics/typeerasure/TypeErasureDemo.java |
5 | Type erasure behavior |
Functional Interfaces (76 exercises)
| # | File | TODOs | Topic |
|---|---|---|---|
| 01 | functionalinterfaces/gettingstarted/FunctionalInterfaceBasics.java |
6 | @FunctionalInterface and lambdas |
| 02 | functionalinterfaces/gettingstarted/LambdaExpressions.java |
7 | Lambda syntax and usage |
| 03 | functionalinterfaces/gettingstarted/MethodReferences.java |
6 | Static, instance, constructor refs |
| 04 | functionalinterfaces/functionalinterfaces/FunctionExercise.java |
7 | Function, andThen, compose |
| 05 | functionalinterfaces/functionalinterfaces/BiFunctionExercise.java |
5 | BiFunction |
| 06 | functionalinterfaces/functionalinterfaces/ConsumerExercise.java |
7 | Consumer, BiConsumer |
| 07 | functionalinterfaces/functionalinterfaces/PredicateExercise.java |
7 | Predicate, and/or/negate |
| 08 | functionalinterfaces/functionalinterfaces/SupplierExercise.java |
6 | Supplier for lazy creation |
| 09 | functionalinterfaces/extending/ExtendingInterfaces.java |
6 | Extending functional interfaces |
| 10 | functionalinterfaces/extending/CombinatorPattern.java |
7 | Validation combinator pattern |
| 11 | functionalinterfaces/callbacks/CallbackExercise.java |
6 | Callback pattern with Consumer |
| 12 | functionalinterfaces/callbacks/EventProcessor.java |
6 | Event-driven processing |
Java Streams (152 exercises)
| # | File | TODOs | Topic |
|---|---|---|---|
| 01 | streams/basics/CreatingStreams.java |
6 | Stream.of, Arrays.stream, generate |
| 02 | streams/basics/FilterBasics.java |
6 | Filtering lists |
| 03 | streams/basics/MapBasics.java |
6 | Mapping/transforming elements |
| 04 | streams/basics/ForEachAndCollect.java |
6 | forEach, collect to List/Set |
| 05 | streams/basics/ReduceBasics.java |
6 | Reduce operations |
| 06 | streams/intstreams/IntStreamBasics.java |
6 | IntStream.range, sum, average |
| 07 | streams/intstreams/IntStreamIterate.java |
5 | IntStream.iterate, LongStream |
| 08 | streams/minmax/MinMax.java |
6 | Finding min/max with Comparator |
| 09 | streams/duplicates/DistinctExercise.java |
6 | distinct(), collect to Set |
| 10 | streams/filtering/FilterExercise.java |
7 | Complex filter conditions |
| 11 | streams/filtering/TakeWhileDropWhile.java |
6 | takeWhile, dropWhile |
| 12 | streams/filtering/FindAndMatch.java |
7 | findFirst, anyMatch, allMatch |
| 13 | streams/transformations/MapExercise.java |
6 | Map objects to different types |
| 14 | streams/transformations/FlatMapExercise.java |
7 | Flatten nested structures |
| 15 | streams/transformations/ReduceExercise.java |
6 | Custom reduce operations |
| 16 | streams/statistics/CountMinMax.java |
6 | count, min, max on objects |
| 17 | streams/statistics/AverageAndSum.java |
6 | mapToInt, average, sum |
| 18 | streams/statistics/SummaryStatistics.java |
5 | IntSummaryStatistics |
| 19 | streams/statistics/GroupingBy.java |
7 | Collectors.groupingBy |
| 20 | streams/statistics/GroupingAndCounting.java |
6 | groupingBy + counting |
| 21 | streams/sorting/SortingExercise.java |
7 | sorted() with Comparator |
| 22 | streams/joiningstrings/JoiningExercise.java |
5 | Collectors.joining |
| 23 | streams/collectors/CollectorsExercise.java |
7 | toMap, partitioningBy, teeing |
| 24 | streams/understanding/LazyStreams.java |
5 | Lazy evaluation, short-circuiting |
| 25 | streams/challenge/StreamsChallenge.java |
8 | Full pipeline challenge |
Unit Testing + Mockito (126 exercises)
Source classes (in src/main/java):
| File | Description |
|---|---|
testing/firsttest/Calculator.java |
Calculator (add, subtract, multiply, divide) |
testing/assertions/StringUtils.java |
String utilities (palindrome, reverse, capitalize) |
testing/scenarios/GradeCalculator.java |
Grade calculator (score to letter grade) |
testing/assertj/Person.java |
Person class for AssertJ exercises |
testing/parameterized/EmailValidator.java |
Email validation |
testing/exceptions/BankAccount.java |
Bank account with exception handling |
testing/tdd/PasswordValidator.java |
Empty - implement via TDD |
testing/tdd/ShippingCostCalculator.java |
Empty - implement via TDD |
testing/mocking/*.java |
Interfaces and classes for mocking exercises |
Test classes (in src/test/java):
| # | File | TODOs | Topic |
|---|---|---|---|
| 01 | testing/firsttest/CalculatorTest.java |
7 | First unit test, assertEquals |
| 02 | testing/assertions/StringUtilsTest.java |
7 | assertTrue, assertFalse, assertAll |
| 03 | testing/assertions/AssertThrowsTest.java |
6 | assertThrows, exception messages |
| 04 | testing/scenarios/GradeCalculatorTest.java |
8 | Test scenarios and boundaries |
| 05 | testing/junitfeatures/JunitFeaturesTest.java |
8 | BeforeEach, Nested, Repeated, Tags |
| 06 | testing/assertj/PersonTest.java |
8 | AssertJ fluent assertions |
| 07 | testing/parameterized/EmailValidatorTest.java |
6 | @ParameterizedTest, @ValueSource |
| 08 | testing/parameterized/CsvSourceTest.java |
5 | @CsvSource, @CsvFileSource |
| 09 | testing/exceptions/BankAccountTest.java |
7 | assertThatThrownBy |
| 10 | testing/tdd/PasswordValidatorTest.java |
8 | TDD - write tests first |
| 11 | testing/tdd/ShippingCostCalculatorTest.java |
6 | TDD exercise |
| 12 | testing/mocking/FirstMockTest.java |
6 | @Mock, when/thenReturn, verify |
| 13 | testing/mocking/MatchersTest.java |
6 | any(), argThat(), eq() |
| 14 | testing/mocking/VerifyInteractionsTest.java |
7 | verifyNoInteractions, times, never |
| 15 | testing/mocking/ArgumentCaptorTest.java |
6 | ArgumentCaptor, @Captor |
| 16 | testing/mocking/BDDMockitoTest.java |
6 | given/willReturn, then/should |
| 17 | testing/mocking/AdvancedMockingTest.java |
7 | Answer, InOrder, spy, timeout |
| 18 | testing/mocking/ClockMockingTest.java |
6 | Mock Clock for time-dependent logic |
| 19 | testing/mocking/ProductServiceTest.java |
7 | Full mocking exercise |
Community
Join the Amigoscode Academy to get help, share your progress, and connect with other learners.