{"id":51833382,"url":"https://github.com/amigoscode/java-exercises","last_synced_at":"2026-07-22T18:01:58.436Z","repository":{"id":368212193,"uuid":"1175791749","full_name":"amigoscode/java-exercises","owner":"amigoscode","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-29T13:28:24.000Z","size":232,"stargazers_count":1,"open_issues_count":12,"forks_count":4,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-29T15:19:27.146Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amigoscode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-08T07:05:51.000Z","updated_at":"2026-06-29T13:29:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/amigoscode/java-exercises","commit_stats":null,"previous_names":["amigoscode/java-exercises"],"tags_count":null,"template":true,"template_full_name":null,"purl":"pkg:github/amigoscode/java-exercises","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amigoscode%2Fjava-exercises","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amigoscode%2Fjava-exercises/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amigoscode%2Fjava-exercises/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amigoscode%2Fjava-exercises/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amigoscode","download_url":"https://codeload.github.com/amigoscode/java-exercises/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amigoscode%2Fjava-exercises/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35771493,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-22T02:00:06.236Z","response_time":124,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-22T18:01:54.949Z","updated_at":"2026-07-22T18:01:58.421Z","avatar_url":"https://github.com/amigoscode.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Amigoscode Java Exercises\n\nGuided hands-on exercises for the Java learning path on\n[Amigoscode Academy](https://skool.com/amigoscode-academy).\n\n## Tech Stack\n\n- Java 25\n- Maven\n- JUnit 5, AssertJ \u0026 Mockito (for testing exercises)\n\n## Branches\n\n| Branch | Description |\n|--------|-------------|\n| `main` | Base setup |\n| `exercises` | All exercises with TODOs |\n| `solutions` | Completed solutions |\n\n## How to Use\n\n1. Checkout the exercises branch:\n   ```bash\n   git checkout exercises\n   ```\n2. Open the project in IntelliJ IDEA\n3. Follow the exercises below in order - each course is a package\n4. Use the **TODO tool window** (`View \u003e Tool Windows \u003e TODO`) to jump to exercise locations in the code\n5. Stuck? Check the solutions branch:\n   ```bash\n   git checkout solutions\n   ```\n\n## Prerequisites\n\n**Java 25 is required.** This project will not compile with older Java versions. Make sure you have Java 25 installed before starting.\n\nYou can check your Java version with:\n```bash\njava -version\n```\n\n## Course Order\n\nThe exercises follow the Java roadmap in this recommended order:\n\n| # | Package | Course(s) | Exercises |\n|---|---------|-----------|-----------|\n| 1 | `beginners` | Java For Beginners | 69 |\n| 2 | `developers` | Java For Developers | 130 |\n| 3 | `oop` | Object Oriented Programming | 95 |\n| 4 | `datastructures` | Data Structures | 99 |\n| 5 | `generics` | Generics | 70 |\n| 6 | `functionalinterfaces` | Functional Interfaces | 76 |\n| 7 | `streams` | Streams Essentials + Java Streams | 152 |\n| 8 | `testing` | Unit Testing Essentials + Unit Testing + Mockito | 126 |\n| **Total** | | **11 courses** | **817** |\n\n## Exercise Breakdown\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eJava For Beginners (69 exercises)\u003c/strong\u003e\u003c/summary\u003e\n\n| # | File | TODOs | Topic |\n|---|------|-------|-------|\n| 01 | `beginners/thebasics/Variables.java` | 7 | Variable declaration and data types |\n| 02 | `beginners/thebasics/TypeCasting.java` | 6 | Implicit/explicit casting and type conversion |\n| 03 | `beginners/thebasics/Operators.java` | 7 | Arithmetic, comparison, logical, and ternary operators |\n| 04 | `beginners/thebasics/StringExercises.java` | 8 | String methods (length, substring, split, equals) |\n| 05 | `beginners/thebasics/ArrayExercises.java` | 7 | Array declaration, access, iteration, and summing |\n| 06 | `beginners/thebasics/ConditionalStatements.java` | 7 | if/else, switch statements, switch expressions |\n| 07 | `beginners/thebasics/LoopExercises.java` | 8 | for, while, do-while, enhanced for, nested loops |\n| 08 | `beginners/thebasics/MethodExercises.java` | 7 | Method creation, return types, overloading |\n| 09 | `beginners/thebasics/ScannerExercises.java` | 6 | Reading user input with Scanner |\n| 10 | `beginners/thebasics/MiniProject.java` | 6 | Simple calculator combining all concepts |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eJava For Developers (130 exercises)\u003c/strong\u003e\u003c/summary\u003e\n\n| # | File | TODOs | Topic |\n|---|------|-------|-------|\n| 01 | `developers/loops/LoopExercises.java` | 7 | Nested loops, break/continue, patterns |\n| 02 | `developers/conditionals/IfStatements.java` | 6 | Ternary, complex conditions, switch expressions |\n| 03 | `developers/packages/PackageDemo.java` | 5 | Imports, static imports, fully qualified names |\n| 04 | `developers/accessmodifiers/AccessModifiers.java` | 6 | public, private, protected, default |\n| 05 | `developers/accessmodifiers/AccessDemo.java` | 5 | Accessing modifiers from another class |\n| 06 | `developers/methods/MethodOverloading.java` | 7 | Method overloading with different parameters |\n| 07 | `developers/methods/VarArgs.java` | 6 | Variable-length arguments |\n| 08 | `developers/strings/StringMethods.java` | 8 | equals, compareTo, contains, replace, split |\n| 09 | `developers/strings/StringBuilderExercises.java` | 6 | StringBuilder operations |\n| 10 | `developers/dates/DateExercises.java` | 7 | LocalDate, LocalDateTime, formatting, parsing |\n| 11 | `developers/bigdecimal/BigDecimalExercises.java` | 6 | BigDecimal arithmetic and comparisons |\n| 12 | `developers/userinput/UserInputExercises.java` | 6 | Scanner with validation |\n| 13 | `developers/exceptions/TryCatch.java` | 7 | try-catch-finally, multi-catch, try-with-resources |\n| 14 | `developers/exceptions/CustomException.java` | 6 | Custom checked and unchecked exceptions |\n| 15 | `developers/files/FileReading.java` | 6 | Reading files with Files and BufferedReader |\n| 16 | `developers/files/FileWriting.java` | 6 | Writing files with Files and BufferedWriter |\n| 17 | `developers/classes/ClassesAndObjects.java` | 7 | Classes, constructors, toString, equals |\n| 18 | `developers/classes/EnumExercises.java` | 6 | Enums with fields, constructors, methods |\n| 19 | `developers/staticmembers/StaticExercises.java` | 6 | Static fields, methods, factory methods |\n| 20 | `developers/nullhandling/OptionalExercises.java` | 7 | Optional.of, ofNullable, map, flatMap |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eObject Oriented Programming (95 exercises)\u003c/strong\u003e\u003c/summary\u003e\n\n| # | File | TODOs | Topic |\n|---|------|-------|-------|\n| 01 | `oop/encapsulation/BankAccount.java` | 7 | Private fields, getters/setters, validation |\n| 02 | `oop/encapsulation/ImmutablePerson.java` | 6 | Immutable class with final fields |\n| 03 | `oop/inheritance/Animal.java` | 5 | Base class with fields and methods |\n| 04 | `oop/inheritance/Dog.java` | 6 | Extending, super(), overriding methods |\n| 05 | `oop/inheritance/Vehicle.java` | 5 | Base class for vehicle hierarchy |\n| 06 | `oop/inheritance/ElectricCar.java` | 6 | Extending, constructor chaining, override |\n| 07 | `oop/abstractclasses/Shape.java` | 5 | Abstract class and abstract methods |\n| 08 | `oop/abstractclasses/Circle.java` | 5 | Implementing abstract methods |\n| 09 | `oop/abstractclasses/Rectangle.java` | 5 | Implementing abstract methods |\n| 10 | `oop/abstractclasses/Employee.java` | 7 | Abstract hierarchy with polymorphism |\n| 11 | `oop/polymorphism/PaymentProcessor.java` | 7 | Interface, multiple implementations |\n| 12 | `oop/polymorphism/ShapeCalculator.java` | 6 | Polymorphic methods, instanceof |\n| 13 | `oop/dependencyinjection/NotificationService.java` | 7 | Constructor injection pattern |\n| 14 | `oop/dependencyinjection/OrderProcessor.java` | 6 | Depend on abstractions |\n| 15 | `oop/solid/SolidExercises.java` | 8 | All 5 SOLID principles |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eData Structures (99 exercises)\u003c/strong\u003e\u003c/summary\u003e\n\n| # | File | TODOs | Topic |\n|---|------|-------|-------|\n| 01 | `datastructures/arrays/ArrayBasics.java` | 7 | Create, fill, search, sort arrays |\n| 02 | `datastructures/arrays/TwoDArrays.java` | 6 | 2D array traversal (matrix) |\n| 03 | `datastructures/arraylist/ArrayListBasics.java` | 7 | Add, remove, contains, iterate |\n| 04 | `datastructures/arraylist/ArrayListOperations.java` | 7 | Sort, reverse, max, subList, toArray |\n| 05 | `datastructures/stacks/StackExercises.java` | 7 | Push, pop, peek, balanced brackets |\n| 06 | `datastructures/queues/QueueExercises.java` | 7 | Queue, PriorityQueue operations |\n| 07 | `datastructures/linkedlists/LinkedListExercises.java` | 7 | addFirst, addLast, Iterator |\n| 08 | `datastructures/linkedlists/LinkedListVsArrayList.java` | 5 | Performance comparison |\n| 09 | `datastructures/sets/HashSetExercises.java` | 7 | Add, contains, remove duplicates |\n| 10 | `datastructures/sets/TreeSetExercises.java` | 6 | Sorted set, subSet, headSet |\n| 11 | `datastructures/maps/HashMapExercises.java` | 8 | put, get, containsKey, iterate |\n| 12 | `datastructures/maps/HashMapWordCount.java` | 6 | Word frequency counter |\n| 13 | `datastructures/maps/TreeMapExercises.java` | 6 | Sorted map operations |\n| 14 | `datastructures/maps/MapAdvanced.java` | 6 | computeIfAbsent, merge, Map.of |\n| 15 | `datastructures/challenge/DataStructureChallenge.java` | 7 | Mini project with multiple structures |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eGenerics (70 exercises)\u003c/strong\u003e\u003c/summary\u003e\n\n| # | File | TODOs | Topic |\n|---|------|-------|-------|\n| 01 | `generics/classcastexception/ClassCastProblem.java` | 5 | Why generics are needed |\n| 02 | `generics/typeparameters/TypeParameterBasics.java` | 6 | Generic class Container\u0026lt;T\u0026gt; |\n| 03 | `generics/genericclasses/Box.java` | 6 | Generic Box\u0026lt;T\u0026gt; class |\n| 04 | `generics/genericclasses/Pair.java` | 7 | Two type parameters Pair\u0026lt;K,V\u0026gt; |\n| 05 | `generics/genericmethods/GenericMethods.java` | 7 | Generic static methods |\n| 06 | `generics/genericmethods/GenericSwap.java` | 5 | Generic swap and reverse |\n| 07 | `generics/boundedtypes/UpperBound.java` | 7 | \u0026lt;T extends Number\u0026gt; |\n| 08 | `generics/boundedtypes/MultipleBounds.java` | 5 | Multiple type bounds |\n| 09 | `generics/wildcards/UnboundedWildcard.java` | 5 | List\u0026lt;?\u0026gt; |\n| 10 | `generics/wildcards/UpperBoundedWildcard.java` | 6 | \u0026lt;? extends Number\u0026gt; |\n| 11 | `generics/wildcards/LowerBoundedWildcard.java` | 6 | \u0026lt;? super Integer\u0026gt; |\n| 12 | `generics/typeerasure/TypeErasureDemo.java` | 5 | Type erasure behavior |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eFunctional Interfaces (76 exercises)\u003c/strong\u003e\u003c/summary\u003e\n\n| # | File | TODOs | Topic |\n|---|------|-------|-------|\n| 01 | `functionalinterfaces/gettingstarted/FunctionalInterfaceBasics.java` | 6 | @FunctionalInterface and lambdas |\n| 02 | `functionalinterfaces/gettingstarted/LambdaExpressions.java` | 7 | Lambda syntax and usage |\n| 03 | `functionalinterfaces/gettingstarted/MethodReferences.java` | 6 | Static, instance, constructor refs |\n| 04 | `functionalinterfaces/functionalinterfaces/FunctionExercise.java` | 7 | Function, andThen, compose |\n| 05 | `functionalinterfaces/functionalinterfaces/BiFunctionExercise.java` | 5 | BiFunction |\n| 06 | `functionalinterfaces/functionalinterfaces/ConsumerExercise.java` | 7 | Consumer, BiConsumer |\n| 07 | `functionalinterfaces/functionalinterfaces/PredicateExercise.java` | 7 | Predicate, and/or/negate |\n| 08 | `functionalinterfaces/functionalinterfaces/SupplierExercise.java` | 6 | Supplier for lazy creation |\n| 09 | `functionalinterfaces/extending/ExtendingInterfaces.java` | 6 | Extending functional interfaces |\n| 10 | `functionalinterfaces/extending/CombinatorPattern.java` | 7 | Validation combinator pattern |\n| 11 | `functionalinterfaces/callbacks/CallbackExercise.java` | 6 | Callback pattern with Consumer |\n| 12 | `functionalinterfaces/callbacks/EventProcessor.java` | 6 | Event-driven processing |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eJava Streams (152 exercises)\u003c/strong\u003e\u003c/summary\u003e\n\n| # | File | TODOs | Topic |\n|---|------|-------|-------|\n| 01 | `streams/basics/CreatingStreams.java` | 6 | Stream.of, Arrays.stream, generate |\n| 02 | `streams/basics/FilterBasics.java` | 6 | Filtering lists |\n| 03 | `streams/basics/MapBasics.java` | 6 | Mapping/transforming elements |\n| 04 | `streams/basics/ForEachAndCollect.java` | 6 | forEach, collect to List/Set |\n| 05 | `streams/basics/ReduceBasics.java` | 6 | Reduce operations |\n| 06 | `streams/intstreams/IntStreamBasics.java` | 6 | IntStream.range, sum, average |\n| 07 | `streams/intstreams/IntStreamIterate.java` | 5 | IntStream.iterate, LongStream |\n| 08 | `streams/minmax/MinMax.java` | 6 | Finding min/max with Comparator |\n| 09 | `streams/duplicates/DistinctExercise.java` | 6 | distinct(), collect to Set |\n| 10 | `streams/filtering/FilterExercise.java` | 7 | Complex filter conditions |\n| 11 | `streams/filtering/TakeWhileDropWhile.java` | 6 | takeWhile, dropWhile |\n| 12 | `streams/filtering/FindAndMatch.java` | 7 | findFirst, anyMatch, allMatch |\n| 13 | `streams/transformations/MapExercise.java` | 6 | Map objects to different types |\n| 14 | `streams/transformations/FlatMapExercise.java` | 7 | Flatten nested structures |\n| 15 | `streams/transformations/ReduceExercise.java` | 6 | Custom reduce operations |\n| 16 | `streams/statistics/CountMinMax.java` | 6 | count, min, max on objects |\n| 17 | `streams/statistics/AverageAndSum.java` | 6 | mapToInt, average, sum |\n| 18 | `streams/statistics/SummaryStatistics.java` | 5 | IntSummaryStatistics |\n| 19 | `streams/statistics/GroupingBy.java` | 7 | Collectors.groupingBy |\n| 20 | `streams/statistics/GroupingAndCounting.java` | 6 | groupingBy + counting |\n| 21 | `streams/sorting/SortingExercise.java` | 7 | sorted() with Comparator |\n| 22 | `streams/joiningstrings/JoiningExercise.java` | 5 | Collectors.joining |\n| 23 | `streams/collectors/CollectorsExercise.java` | 7 | toMap, partitioningBy, teeing |\n| 24 | `streams/understanding/LazyStreams.java` | 5 | Lazy evaluation, short-circuiting |\n| 25 | `streams/challenge/StreamsChallenge.java` | 8 | Full pipeline challenge |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eUnit Testing + Mockito (126 exercises)\u003c/strong\u003e\u003c/summary\u003e\n\n**Source classes** (in `src/main/java`):\n\n| File | Description |\n|------|-------------|\n| `testing/firsttest/Calculator.java` | Calculator (add, subtract, multiply, divide) |\n| `testing/assertions/StringUtils.java` | String utilities (palindrome, reverse, capitalize) |\n| `testing/scenarios/GradeCalculator.java` | Grade calculator (score to letter grade) |\n| `testing/assertj/Person.java` | Person class for AssertJ exercises |\n| `testing/parameterized/EmailValidator.java` | Email validation |\n| `testing/exceptions/BankAccount.java` | Bank account with exception handling |\n| `testing/tdd/PasswordValidator.java` | Empty - implement via TDD |\n| `testing/tdd/ShippingCostCalculator.java` | Empty - implement via TDD |\n| `testing/mocking/*.java` | Interfaces and classes for mocking exercises |\n\n**Test classes** (in `src/test/java`):\n\n| # | File | TODOs | Topic |\n|---|------|-------|-------|\n| 01 | `testing/firsttest/CalculatorTest.java` | 7 | First unit test, assertEquals |\n| 02 | `testing/assertions/StringUtilsTest.java` | 7 | assertTrue, assertFalse, assertAll |\n| 03 | `testing/assertions/AssertThrowsTest.java` | 6 | assertThrows, exception messages |\n| 04 | `testing/scenarios/GradeCalculatorTest.java` | 8 | Test scenarios and boundaries |\n| 05 | `testing/junitfeatures/JunitFeaturesTest.java` | 8 | BeforeEach, Nested, Repeated, Tags |\n| 06 | `testing/assertj/PersonTest.java` | 8 | AssertJ fluent assertions |\n| 07 | `testing/parameterized/EmailValidatorTest.java` | 6 | @ParameterizedTest, @ValueSource |\n| 08 | `testing/parameterized/CsvSourceTest.java` | 5 | @CsvSource, @CsvFileSource |\n| 09 | `testing/exceptions/BankAccountTest.java` | 7 | assertThatThrownBy |\n| 10 | `testing/tdd/PasswordValidatorTest.java` | 8 | TDD - write tests first |\n| 11 | `testing/tdd/ShippingCostCalculatorTest.java` | 6 | TDD exercise |\n| 12 | `testing/mocking/FirstMockTest.java` | 6 | @Mock, when/thenReturn, verify |\n| 13 | `testing/mocking/MatchersTest.java` | 6 | any(), argThat(), eq() |\n| 14 | `testing/mocking/VerifyInteractionsTest.java` | 7 | verifyNoInteractions, times, never |\n| 15 | `testing/mocking/ArgumentCaptorTest.java` | 6 | ArgumentCaptor, @Captor |\n| 16 | `testing/mocking/BDDMockitoTest.java` | 6 | given/willReturn, then/should |\n| 17 | `testing/mocking/AdvancedMockingTest.java` | 7 | Answer, InOrder, spy, timeout |\n| 18 | `testing/mocking/ClockMockingTest.java` | 6 | Mock Clock for time-dependent logic |\n| 19 | `testing/mocking/ProductServiceTest.java` | 7 | Full mocking exercise |\n\n\u003c/details\u003e\n\n## Community\n\nJoin the [Amigoscode Academy](https://skool.com/amigoscode) to get help,\nshare your progress, and connect with other learners.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famigoscode%2Fjava-exercises","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famigoscode%2Fjava-exercises","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famigoscode%2Fjava-exercises/lists"}