@ngxtm/devkit 3.4.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/rules/README.md +141 -0
- package/rules/dart/best-practices/SKILL.md +23 -0
- package/rules/dart/language/SKILL.md +52 -0
- package/rules/dart/tooling/SKILL.md +43 -0
- package/rules/dotnet/aspnet-core/SKILL.md +92 -0
- package/rules/dotnet/aspnet-core/references/REFERENCE.md +335 -0
- package/rules/dotnet/best-practices/SKILL.md +101 -0
- package/rules/dotnet/best-practices/references/REFERENCE.md +256 -0
- package/rules/dotnet/blazor/SKILL.md +146 -0
- package/rules/dotnet/blazor/references/REFERENCE.md +392 -0
- package/rules/dotnet/language/SKILL.md +82 -0
- package/rules/dotnet/language/references/REFERENCE.md +222 -0
- package/rules/dotnet/patterns.rule.md +388 -0
- package/rules/dotnet/razor-pages/SKILL.md +124 -0
- package/rules/dotnet/razor-pages/references/REFERENCE.md +321 -0
- package/rules/dotnet/security/SKILL.md +89 -0
- package/rules/dotnet/security/references/REFERENCE.md +295 -0
- package/rules/dotnet/tooling/SKILL.md +92 -0
- package/rules/dotnet/tooling/references/REFERENCE.md +300 -0
- package/rules/flutter/auto-route-navigation/SKILL.md +43 -0
- package/rules/flutter/auto-route-navigation/references/REFERENCE.md +19 -0
- package/rules/flutter/auto-route-navigation/references/router-config.md +62 -0
- package/rules/flutter/bloc-state-management/SKILL.md +64 -0
- package/rules/flutter/bloc-state-management/references/REFERENCE.md +20 -0
- package/rules/flutter/bloc-state-management/references/auth-bloc-example.md +52 -0
- package/rules/flutter/bloc-state-management/references/equatable-usage.md +56 -0
- package/rules/flutter/bloc-state-management/references/property-based-state.md +68 -0
- package/rules/flutter/bloc.rule.md +76 -0
- package/rules/flutter/cicd/SKILL.md +48 -0
- package/rules/flutter/cicd/references/advanced-workflow.md +66 -0
- package/rules/flutter/cicd/references/fastlane.md +139 -0
- package/rules/flutter/cicd/references/github-actions.md +59 -0
- package/rules/flutter/dependency-injection/SKILL.md +42 -0
- package/rules/flutter/dependency-injection/references/REFERENCE.md +15 -0
- package/rules/flutter/dependency-injection/references/modules.md +37 -0
- package/rules/flutter/error-handling/SKILL.md +32 -0
- package/rules/flutter/error-handling/references/REFERENCE.md +19 -0
- package/rules/flutter/error-handling/references/error-mapping.md +31 -0
- package/rules/flutter/feature-based-clean-architecture/SKILL.md +46 -0
- package/rules/flutter/feature-based-clean-architecture/references/REFERENCE.md +14 -0
- package/rules/flutter/feature-based-clean-architecture/references/folder-structure.md +36 -0
- package/rules/flutter/getx-navigation/SKILL.md +70 -0
- package/rules/flutter/getx-navigation/references/app-pages.md +40 -0
- package/rules/flutter/getx-navigation/references/middleware-example.md +29 -0
- package/rules/flutter/getx-state-management/SKILL.md +76 -0
- package/rules/flutter/getx-state-management/references/binding-example.md +32 -0
- package/rules/flutter/getx-state-management/references/reactive-vs-simple.md +39 -0
- package/rules/flutter/go-router-navigation/SKILL.md +57 -0
- package/rules/flutter/idiomatic-flutter/SKILL.md +20 -0
- package/rules/flutter/layer-based-clean-architecture/SKILL.md +50 -0
- package/rules/flutter/layer-based-clean-architecture/references/REFERENCE.md +60 -0
- package/rules/flutter/layer-based-clean-architecture/references/repository-mapping.md +50 -0
- package/rules/flutter/localization/SKILL.md +50 -0
- package/rules/flutter/localization/references/REFERENCE.md +48 -0
- package/rules/flutter/localization/references/sheet-loader.md +33 -0
- package/rules/flutter/navigator-v1-navigation/SKILL.md +71 -0
- package/rules/flutter/navigator-v1-navigation/references/on-generate-route.md +48 -0
- package/rules/flutter/performance/SKILL.md +24 -0
- package/rules/flutter/retrofit-networking/SKILL.md +51 -0
- package/rules/flutter/retrofit-networking/references/REFERENCE.md +19 -0
- package/rules/flutter/retrofit-networking/references/token-refresh.md +40 -0
- package/rules/flutter/riverpod-state-management/SKILL.md +53 -0
- package/rules/flutter/riverpod-state-management/references/architecture.md +124 -0
- package/rules/flutter/riverpod-state-management/references/best-practices.md +89 -0
- package/rules/flutter/riverpod-state-management/references/testing.md +73 -0
- package/rules/flutter/riverpod.rule.md +78 -0
- package/rules/flutter/security/SKILL.md +33 -0
- package/rules/flutter/security/references/REFERENCE.md +15 -0
- package/rules/flutter/security/references/network-security.md +28 -0
- package/rules/flutter/testing/SKILL.md +44 -0
- package/rules/flutter/testing/references/REFERENCE.md +21 -0
- package/rules/flutter/testing/references/bloc-testing.md +38 -0
- package/rules/flutter/testing/references/integration-testing.md +128 -0
- package/rules/flutter/testing/references/robot-pattern.md +82 -0
- package/rules/flutter/testing/references/unit-testing.md +130 -0
- package/rules/flutter/testing/references/widget-testing.md +120 -0
- package/rules/flutter/widgets/SKILL.md +37 -0
- package/rules/golang/chi-router/SKILL.md +219 -0
- package/rules/golang/chi-router/references/REFERENCE.md +13 -0
- package/rules/golang/chi-router/references/routing-patterns.md +205 -0
- package/rules/golang/cobra-cli/SKILL.md +227 -0
- package/rules/golang/cobra-cli/references/REFERENCE.md +13 -0
- package/rules/golang/cobra-cli/references/command-patterns.md +224 -0
- package/rules/golang/core/SKILL.md +210 -0
- package/rules/golang/core/references/REFERENCE.md +14 -0
- package/rules/golang/core/references/concurrency-patterns.md +114 -0
- package/rules/golang/core/references/error-handling.md +87 -0
- package/rules/golang/echo-framework/SKILL.md +215 -0
- package/rules/golang/echo-framework/references/REFERENCE.md +14 -0
- package/rules/golang/echo-framework/references/middleware-patterns.md +141 -0
- package/rules/golang/echo-framework/references/routing-patterns.md +140 -0
- package/rules/golang/ent-orm/SKILL.md +239 -0
- package/rules/golang/ent-orm/references/REFERENCE.md +13 -0
- package/rules/golang/ent-orm/references/schema-patterns.md +255 -0
- package/rules/golang/fiber-framework/SKILL.md +196 -0
- package/rules/golang/fiber-framework/references/REFERENCE.md +13 -0
- package/rules/golang/fiber-framework/references/routing-patterns.md +191 -0
- package/rules/golang/gin-framework/SKILL.md +205 -0
- package/rules/golang/gin-framework/references/REFERENCE.md +14 -0
- package/rules/golang/gin-framework/references/middleware-patterns.md +119 -0
- package/rules/golang/gorm-orm/SKILL.md +196 -0
- package/rules/golang/gorm-orm/references/REFERENCE.md +14 -0
- package/rules/golang/gorm-orm/references/model-definitions.md +167 -0
- package/rules/golang/gorm-orm/references/query-patterns.md +161 -0
- package/rules/golang/grpc/SKILL.md +231 -0
- package/rules/golang/grpc/references/REFERENCE.md +13 -0
- package/rules/golang/grpc/references/service-patterns.md +276 -0
- package/rules/golang/testify/SKILL.md +239 -0
- package/rules/golang/testify/references/REFERENCE.md +13 -0
- package/rules/golang/testify/references/assert-patterns.md +170 -0
- package/rules/golang/validator/SKILL.md +234 -0
- package/rules/golang/validator/references/REFERENCE.md +13 -0
- package/rules/golang/validator/references/validation-tags.md +211 -0
- package/rules/golang/viper-config/SKILL.md +244 -0
- package/rules/golang/viper-config/references/REFERENCE.md +13 -0
- package/rules/golang/viper-config/references/config-loading.md +181 -0
- package/rules/golang/wire-di/SKILL.md +243 -0
- package/rules/golang/wire-di/references/REFERENCE.md +13 -0
- package/rules/golang/wire-di/references/provider-patterns.md +193 -0
- package/rules/golang/zap-logging/SKILL.md +203 -0
- package/rules/golang/zap-logging/references/REFERENCE.md +13 -0
- package/rules/golang/zap-logging/references/logger-config.md +165 -0
- package/rules/java/build-gradle/SKILL.md +92 -0
- package/rules/java/build-gradle/references/REFERENCE.md +14 -0
- package/rules/java/build-gradle/references/kotlin-dsl.md +118 -0
- package/rules/java/build-gradle/references/task-configuration.md +132 -0
- package/rules/java/build-maven/SKILL.md +86 -0
- package/rules/java/build-maven/references/REFERENCE.md +14 -0
- package/rules/java/build-maven/references/dependency-management.md +111 -0
- package/rules/java/build-maven/references/lifecycle-phases.md +114 -0
- package/rules/java/graalvm-native/SKILL.md +105 -0
- package/rules/java/graalvm-native/references/REFERENCE.md +12 -0
- package/rules/java/java-collections-streams/SKILL.md +148 -0
- package/rules/java/java-collections-streams/references/REFERENCE.md +15 -0
- package/rules/java/java-collections-streams/references/collectors-patterns.md +178 -0
- package/rules/java/java-collections-streams/references/stream-pipelines.md +165 -0
- package/rules/java/java-concurrency/SKILL.md +187 -0
- package/rules/java/java-concurrency/references/REFERENCE.md +17 -0
- package/rules/java/java-concurrency/references/completable-future.md +165 -0
- package/rules/java/java-concurrency/references/executor-patterns.md +176 -0
- package/rules/java/java-concurrency/references/virtual-threads.md +190 -0
- package/rules/java/java-core-language/SKILL.md +121 -0
- package/rules/java/java-core-language/references/REFERENCE.md +15 -0
- package/rules/java/java-core-language/references/jvm-memory-model.md +160 -0
- package/rules/java/java-core-language/references/modern-java-features.md +168 -0
- package/rules/java/java-project-structure/SKILL.md +195 -0
- package/rules/java/java-project-structure/references/REFERENCE.md +15 -0
- package/rules/java/java-project-structure/references/maven-project-layout.md +199 -0
- package/rules/java/java-project-structure/references/module-system.md +159 -0
- package/rules/java/micronaut-core/SKILL.md +99 -0
- package/rules/java/micronaut-core/references/REFERENCE.md +12 -0
- package/rules/java/micronaut-reactive/SKILL.md +68 -0
- package/rules/java/micronaut-reactive/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-core/SKILL.md +85 -0
- package/rules/java/quarkus-core/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-reactive/SKILL.md +67 -0
- package/rules/java/quarkus-reactive/references/REFERENCE.md +12 -0
- package/rules/java/spring-batch/SKILL.md +102 -0
- package/rules/java/spring-batch/references/REFERENCE.md +12 -0
- package/rules/java/spring-boot-architecture/SKILL.md +206 -0
- package/rules/java/spring-boot-architecture/references/REFERENCE.md +15 -0
- package/rules/java/spring-boot-architecture/references/auto-configuration.md +158 -0
- package/rules/java/spring-boot-architecture/references/configuration-properties.md +202 -0
- package/rules/java/spring-boot-web/SKILL.md +217 -0
- package/rules/java/spring-boot-web/references/REFERENCE.md +17 -0
- package/rules/java/spring-cloud/SKILL.md +109 -0
- package/rules/java/spring-cloud/references/REFERENCE.md +13 -0
- package/rules/java/spring-data-jpa/SKILL.md +241 -0
- package/rules/java/spring-data-jpa/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/SKILL.md +161 -0
- package/rules/java/spring-security/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/references/jwt-auth-flow.md +213 -0
- package/rules/java/testing-junit-mockito/SKILL.md +135 -0
- package/rules/java/testing-junit-mockito/references/REFERENCE.md +15 -0
- package/rules/java/testing-junit-mockito/references/junit5-patterns.md +159 -0
- package/rules/java/testing-junit-mockito/references/mockito-patterns.md +148 -0
- package/rules/java/testing-junit-mockito/references/spring-boot-testing.md +152 -0
- package/rules/javascript/best-practices/SKILL.md +64 -0
- package/rules/javascript/best-practices/references/REFERENCE.md +91 -0
- package/rules/javascript/language/SKILL.md +71 -0
- package/rules/javascript/language/references/REFERENCE.md +106 -0
- package/rules/javascript/tooling/SKILL.md +60 -0
- package/rules/javascript/tooling/references/REFERENCE.md +107 -0
- package/rules/metadata.json +54 -0
- package/rules/nestjs/api-standards/SKILL.md +47 -0
- package/rules/nestjs/api-standards/references/pagination-wrapper.md +87 -0
- package/rules/nestjs/architecture/SKILL.md +68 -0
- package/rules/nestjs/architecture/references/dynamic-module.md +53 -0
- package/rules/nestjs/caching/SKILL.md +51 -0
- package/rules/nestjs/caching/references/REFERENCE.md +13 -0
- package/rules/nestjs/caching/references/cache-patterns.md +183 -0
- package/rules/nestjs/configuration/SKILL.md +41 -0
- package/rules/nestjs/configuration/references/REFERENCE.md +13 -0
- package/rules/nestjs/configuration/references/config-patterns.md +184 -0
- package/rules/nestjs/controllers-services/SKILL.md +63 -0
- package/rules/nestjs/controllers-services/references/REFERENCE.md +14 -0
- package/rules/nestjs/controllers-services/references/controller-patterns.md +119 -0
- package/rules/nestjs/controllers-services/references/service-patterns.md +129 -0
- package/rules/nestjs/database/SKILL.md +102 -0
- package/rules/nestjs/database/references/REFERENCE.md +14 -0
- package/rules/nestjs/database/references/typeorm-patterns.md +156 -0
- package/rules/nestjs/deployment/SKILL.md +36 -0
- package/rules/nestjs/deployment/references/REFERENCE.md +13 -0
- package/rules/nestjs/deployment/references/deployment-patterns.md +140 -0
- package/rules/nestjs/documentation/SKILL.md +64 -0
- package/rules/nestjs/documentation/references/REFERENCE.md +13 -0
- package/rules/nestjs/documentation/references/swagger-patterns.md +139 -0
- package/rules/nestjs/error-handling/SKILL.md +55 -0
- package/rules/nestjs/error-handling/references/REFERENCE.md +13 -0
- package/rules/nestjs/error-handling/references/exception-filters.md +152 -0
- package/rules/nestjs/file-uploads/SKILL.md +35 -0
- package/rules/nestjs/file-uploads/references/REFERENCE.md +13 -0
- package/rules/nestjs/file-uploads/references/upload-patterns.md +125 -0
- package/rules/nestjs/observability/SKILL.md +39 -0
- package/rules/nestjs/observability/references/REFERENCE.md +13 -0
- package/rules/nestjs/observability/references/logging-metrics.md +175 -0
- package/rules/nestjs/performance/SKILL.md +60 -0
- package/rules/nestjs/performance/references/REFERENCE.md +13 -0
- package/rules/nestjs/performance/references/performance-patterns.md +107 -0
- package/rules/nestjs/real-time/SKILL.md +45 -0
- package/rules/nestjs/real-time/references/REFERENCE.md +13 -0
- package/rules/nestjs/real-time/references/websocket-patterns.md +121 -0
- package/rules/nestjs/scheduling/SKILL.md +39 -0
- package/rules/nestjs/scheduling/references/REFERENCE.md +13 -0
- package/rules/nestjs/scheduling/references/scheduling-patterns.md +137 -0
- package/rules/nestjs/search/SKILL.md +41 -0
- package/rules/nestjs/search/references/REFERENCE.md +13 -0
- package/rules/nestjs/search/references/search-patterns.md +137 -0
- package/rules/nestjs/security/SKILL.md +87 -0
- package/rules/nestjs/security/references/REFERENCE.md +14 -0
- package/rules/nestjs/security/references/authentication.md +151 -0
- package/rules/nestjs/testing/SKILL.md +40 -0
- package/rules/nestjs/testing/references/REFERENCE.md +14 -0
- package/rules/nestjs/testing/references/unit-testing.md +179 -0
- package/rules/nestjs/transport/SKILL.md +45 -0
- package/rules/nestjs/transport/references/REFERENCE.md +13 -0
- package/rules/nestjs/transport/references/microservices-patterns.md +170 -0
- package/rules/nextjs/app-router/SKILL.md +46 -0
- package/rules/nextjs/app-router/references/REFERENCE.md +14 -0
- package/rules/nextjs/app-router/references/routing-patterns.md +182 -0
- package/rules/nextjs/architecture/SKILL.md +44 -0
- package/rules/nextjs/architecture/references/fsd-structure.md +77 -0
- package/rules/nextjs/authentication/SKILL.md +29 -0
- package/rules/nextjs/authentication/references/auth-implementation.md +73 -0
- package/rules/nextjs/caching/SKILL.md +66 -0
- package/rules/nextjs/caching/references/REFERENCE.md +13 -0
- package/rules/nextjs/caching/references/cache-strategies.md +168 -0
- package/rules/nextjs/data-access-layer/SKILL.md +33 -0
- package/rules/nextjs/data-access-layer/references/patterns.md +66 -0
- package/rules/nextjs/data-fetching/SKILL.md +59 -0
- package/rules/nextjs/data-fetching/references/REFERENCE.md +13 -0
- package/rules/nextjs/data-fetching/references/fetch-patterns.md +160 -0
- package/rules/nextjs/internationalization/SKILL.md +105 -0
- package/rules/nextjs/internationalization/references/REFERENCE.md +13 -0
- package/rules/nextjs/internationalization/references/i18n-patterns.md +180 -0
- package/rules/nextjs/optimization/SKILL.md +64 -0
- package/rules/nextjs/optimization/references/REFERENCE.md +13 -0
- package/rules/nextjs/optimization/references/optimization-patterns.md +190 -0
- package/rules/nextjs/rendering/SKILL.md +91 -0
- package/rules/nextjs/rendering/references/REFERENCE.md +13 -0
- package/rules/nextjs/rendering/references/rendering-modes.md +163 -0
- package/rules/nextjs/server-actions/SKILL.md +46 -0
- package/rules/nextjs/server-actions/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-actions/references/action-patterns.md +188 -0
- package/rules/nextjs/server-components/SKILL.md +52 -0
- package/rules/nextjs/server-components/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-components/references/component-patterns.md +175 -0
- package/rules/nextjs/state-management/SKILL.md +73 -0
- package/rules/nextjs/state-management/references/REFERENCE.md +13 -0
- package/rules/nextjs/state-management/references/state-patterns.md +218 -0
- package/rules/nextjs/styling/SKILL.md +31 -0
- package/rules/nextjs/styling/references/implementation.md +56 -0
- package/rules/react/component-patterns/SKILL.md +66 -0
- package/rules/react/component-patterns/references/REFERENCE.md +126 -0
- package/rules/react/hooks/SKILL.md +60 -0
- package/rules/react/hooks/references/REFERENCE.md +132 -0
- package/rules/react/hooks.rule.md +79 -0
- package/rules/react/performance/SKILL.md +69 -0
- package/rules/react/performance/references/REFERENCE.md +143 -0
- package/rules/react/security/SKILL.md +46 -0
- package/rules/react/security/references/REFERENCE.md +170 -0
- package/rules/react/state-management/SKILL.md +56 -0
- package/rules/react/state-management/references/REFERENCE.md +137 -0
- package/rules/react/testing/SKILL.md +45 -0
- package/rules/react/testing/references/REFERENCE.md +149 -0
- package/rules/react/tooling/SKILL.md +39 -0
- package/rules/react/typescript/SKILL.md +53 -0
- package/rules/rust/actix-web/SKILL.md +160 -0
- package/rules/rust/actix-web/references/REFERENCE.md +13 -0
- package/rules/rust/actix-web/references/handler-patterns.md +198 -0
- package/rules/rust/async-graphql/SKILL.md +228 -0
- package/rules/rust/async-graphql/references/REFERENCE.md +13 -0
- package/rules/rust/async-graphql/references/schema-patterns.md +215 -0
- package/rules/rust/axum/SKILL.md +161 -0
- package/rules/rust/axum/references/REFERENCE.md +14 -0
- package/rules/rust/axum/references/handler-patterns.md +97 -0
- package/rules/rust/bevy/SKILL.md +206 -0
- package/rules/rust/bevy/references/REFERENCE.md +13 -0
- package/rules/rust/bevy/references/ecs-patterns.md +226 -0
- package/rules/rust/clap/SKILL.md +217 -0
- package/rules/rust/clap/references/REFERENCE.md +13 -0
- package/rules/rust/clap/references/derive-patterns.md +205 -0
- package/rules/rust/core/SKILL.md +154 -0
- package/rules/rust/core/references/REFERENCE.md +14 -0
- package/rules/rust/core/references/error-handling.md +92 -0
- package/rules/rust/diesel-orm/SKILL.md +176 -0
- package/rules/rust/diesel-orm/references/REFERENCE.md +13 -0
- package/rules/rust/diesel-orm/references/schema-patterns.md +206 -0
- package/rules/rust/rocket/SKILL.md +182 -0
- package/rules/rust/rocket/references/REFERENCE.md +13 -0
- package/rules/rust/rocket/references/handler-patterns.md +209 -0
- package/rules/rust/sea-orm/SKILL.md +230 -0
- package/rules/rust/sea-orm/references/REFERENCE.md +13 -0
- package/rules/rust/sea-orm/references/entity-patterns.md +221 -0
- package/rules/rust/serde-serialization/SKILL.md +150 -0
- package/rules/rust/serde-serialization/references/REFERENCE.md +13 -0
- package/rules/rust/serde-serialization/references/serialization-patterns.md +199 -0
- package/rules/rust/sqlx-database/SKILL.md +140 -0
- package/rules/rust/sqlx-database/references/REFERENCE.md +13 -0
- package/rules/rust/sqlx-database/references/query-patterns.md +210 -0
- package/rules/rust/tauri/SKILL.md +180 -0
- package/rules/rust/tauri/references/REFERENCE.md +13 -0
- package/rules/rust/tauri/references/command-patterns.md +209 -0
- package/rules/rust/tokio-runtime/SKILL.md +167 -0
- package/rules/rust/tokio-runtime/references/REFERENCE.md +14 -0
- package/rules/rust/tokio-runtime/references/async-patterns.md +137 -0
- package/rules/rust/tokio-runtime/references/synchronization.md +152 -0
- package/rules/rust/tonic/SKILL.md +231 -0
- package/rules/rust/tonic/references/REFERENCE.md +13 -0
- package/rules/rust/tonic/references/service-patterns.md +213 -0
- package/rules/rust/tracing/SKILL.md +214 -0
- package/rules/rust/tracing/references/REFERENCE.md +13 -0
- package/rules/rust/tracing/references/instrumentation.md +187 -0
- package/rules/typescript/best-practices/SKILL.md +108 -0
- package/rules/typescript/best-practices/references/REFERENCE.md +68 -0
- package/rules/typescript/language/SKILL.md +72 -0
- package/rules/typescript/language/references/REFERENCE.md +67 -0
- package/rules/typescript/patterns.rule.md +85 -0
- package/rules/typescript/security/SKILL.md +59 -0
- package/rules/typescript/security/references/REFERENCE.md +113 -0
- package/rules/typescript/tooling/SKILL.md +52 -0
- package/rules/typescript/tooling/references/REFERENCE.md +110 -0
- package/skills/learn/SKILL.md +476 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Maven Dependency Management
|
|
2
|
+
|
|
3
|
+
## Dependency Scopes
|
|
4
|
+
|
|
5
|
+
```xml
|
|
6
|
+
<dependencies>
|
|
7
|
+
<!-- compile (default) - available everywhere -->
|
|
8
|
+
<dependency>
|
|
9
|
+
<groupId>org.springframework.boot</groupId>
|
|
10
|
+
<artifactId>spring-boot-starter-web</artifactId>
|
|
11
|
+
</dependency>
|
|
12
|
+
|
|
13
|
+
<!-- provided - compile only, container provides at runtime -->
|
|
14
|
+
<dependency>
|
|
15
|
+
<groupId>jakarta.servlet</groupId>
|
|
16
|
+
<artifactId>jakarta.servlet-api</artifactId>
|
|
17
|
+
<scope>provided</scope>
|
|
18
|
+
</dependency>
|
|
19
|
+
|
|
20
|
+
<!-- runtime - not needed for compile -->
|
|
21
|
+
<dependency>
|
|
22
|
+
<groupId>org.postgresql</groupId>
|
|
23
|
+
<artifactId>postgresql</artifactId>
|
|
24
|
+
<scope>runtime</scope>
|
|
25
|
+
</dependency>
|
|
26
|
+
|
|
27
|
+
<!-- test - only for tests -->
|
|
28
|
+
<dependency>
|
|
29
|
+
<groupId>org.junit.jupiter</groupId>
|
|
30
|
+
<artifactId>junit-jupiter</artifactId>
|
|
31
|
+
<scope>test</scope>
|
|
32
|
+
</dependency>
|
|
33
|
+
</dependencies>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## BOM (Bill of Materials)
|
|
37
|
+
|
|
38
|
+
```xml
|
|
39
|
+
<dependencyManagement>
|
|
40
|
+
<dependencies>
|
|
41
|
+
<!-- Import BOM -->
|
|
42
|
+
<dependency>
|
|
43
|
+
<groupId>org.springframework.boot</groupId>
|
|
44
|
+
<artifactId>spring-boot-dependencies</artifactId>
|
|
45
|
+
<version>3.2.0</version>
|
|
46
|
+
<type>pom</type>
|
|
47
|
+
<scope>import</scope>
|
|
48
|
+
</dependency>
|
|
49
|
+
|
|
50
|
+
<!-- Now use without version -->
|
|
51
|
+
</dependencies>
|
|
52
|
+
</dependencyManagement>
|
|
53
|
+
|
|
54
|
+
<dependencies>
|
|
55
|
+
<dependency>
|
|
56
|
+
<groupId>org.springframework.boot</groupId>
|
|
57
|
+
<artifactId>spring-boot-starter-web</artifactId>
|
|
58
|
+
<!-- Version inherited from BOM -->
|
|
59
|
+
</dependency>
|
|
60
|
+
</dependencies>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Exclusions
|
|
64
|
+
|
|
65
|
+
```xml
|
|
66
|
+
<dependency>
|
|
67
|
+
<groupId>org.springframework.boot</groupId>
|
|
68
|
+
<artifactId>spring-boot-starter-web</artifactId>
|
|
69
|
+
<exclusions>
|
|
70
|
+
<exclusion>
|
|
71
|
+
<groupId>org.springframework.boot</groupId>
|
|
72
|
+
<artifactId>spring-boot-starter-tomcat</artifactId>
|
|
73
|
+
</exclusion>
|
|
74
|
+
</exclusions>
|
|
75
|
+
</dependency>
|
|
76
|
+
|
|
77
|
+
<!-- Replace with Jetty -->
|
|
78
|
+
<dependency>
|
|
79
|
+
<groupId>org.springframework.boot</groupId>
|
|
80
|
+
<artifactId>spring-boot-starter-jetty</artifactId>
|
|
81
|
+
</dependency>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Version Properties
|
|
85
|
+
|
|
86
|
+
```xml
|
|
87
|
+
<properties>
|
|
88
|
+
<java.version>21</java.version>
|
|
89
|
+
<spring-boot.version>3.2.0</spring-boot.version>
|
|
90
|
+
<lombok.version>1.18.30</lombok.version>
|
|
91
|
+
</properties>
|
|
92
|
+
|
|
93
|
+
<dependencies>
|
|
94
|
+
<dependency>
|
|
95
|
+
<groupId>org.projectlombok</groupId>
|
|
96
|
+
<artifactId>lombok</artifactId>
|
|
97
|
+
<version>${lombok.version}</version>
|
|
98
|
+
<scope>provided</scope>
|
|
99
|
+
</dependency>
|
|
100
|
+
</dependencies>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Optional Dependencies
|
|
104
|
+
|
|
105
|
+
```xml
|
|
106
|
+
<dependency>
|
|
107
|
+
<groupId>com.example</groupId>
|
|
108
|
+
<artifactId>optional-feature</artifactId>
|
|
109
|
+
<optional>true</optional>
|
|
110
|
+
</dependency>
|
|
111
|
+
```
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Maven Lifecycle Phases
|
|
2
|
+
|
|
3
|
+
## Default Lifecycle
|
|
4
|
+
|
|
5
|
+
```xml
|
|
6
|
+
<!-- Phase order: validate → compile → test → package → verify → install → deploy -->
|
|
7
|
+
|
|
8
|
+
<!-- Skip tests during build -->
|
|
9
|
+
<properties>
|
|
10
|
+
<maven.test.skip>true</maven.test.skip>
|
|
11
|
+
<!-- Or just skip execution, still compile -->
|
|
12
|
+
<skipTests>true</skipTests>
|
|
13
|
+
</properties>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Common Commands
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Clean and build
|
|
20
|
+
mvn clean install
|
|
21
|
+
|
|
22
|
+
# Build without tests
|
|
23
|
+
mvn clean install -DskipTests
|
|
24
|
+
|
|
25
|
+
# Run specific phase
|
|
26
|
+
mvn compile
|
|
27
|
+
mvn test
|
|
28
|
+
mvn package
|
|
29
|
+
|
|
30
|
+
# Run with profile
|
|
31
|
+
mvn clean install -Pproduction
|
|
32
|
+
|
|
33
|
+
# Debug output
|
|
34
|
+
mvn clean install -X
|
|
35
|
+
|
|
36
|
+
# Dependency tree
|
|
37
|
+
mvn dependency:tree
|
|
38
|
+
|
|
39
|
+
# Effective POM
|
|
40
|
+
mvn help:effective-pom
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Plugin Configuration
|
|
44
|
+
|
|
45
|
+
```xml
|
|
46
|
+
<build>
|
|
47
|
+
<plugins>
|
|
48
|
+
<!-- Compiler plugin -->
|
|
49
|
+
<plugin>
|
|
50
|
+
<groupId>org.apache.maven.plugins</groupId>
|
|
51
|
+
<artifactId>maven-compiler-plugin</artifactId>
|
|
52
|
+
<version>3.11.0</version>
|
|
53
|
+
<configuration>
|
|
54
|
+
<source>21</source>
|
|
55
|
+
<target>21</target>
|
|
56
|
+
<compilerArgs>
|
|
57
|
+
<arg>--enable-preview</arg>
|
|
58
|
+
</compilerArgs>
|
|
59
|
+
</configuration>
|
|
60
|
+
</plugin>
|
|
61
|
+
|
|
62
|
+
<!-- Surefire for unit tests -->
|
|
63
|
+
<plugin>
|
|
64
|
+
<groupId>org.apache.maven.plugins</groupId>
|
|
65
|
+
<artifactId>maven-surefire-plugin</artifactId>
|
|
66
|
+
<version>3.1.2</version>
|
|
67
|
+
<configuration>
|
|
68
|
+
<includes>
|
|
69
|
+
<include>**/*Test.java</include>
|
|
70
|
+
</includes>
|
|
71
|
+
</configuration>
|
|
72
|
+
</plugin>
|
|
73
|
+
|
|
74
|
+
<!-- Failsafe for integration tests -->
|
|
75
|
+
<plugin>
|
|
76
|
+
<groupId>org.apache.maven.plugins</groupId>
|
|
77
|
+
<artifactId>maven-failsafe-plugin</artifactId>
|
|
78
|
+
<version>3.1.2</version>
|
|
79
|
+
<executions>
|
|
80
|
+
<execution>
|
|
81
|
+
<goals>
|
|
82
|
+
<goal>integration-test</goal>
|
|
83
|
+
<goal>verify</goal>
|
|
84
|
+
</goals>
|
|
85
|
+
</execution>
|
|
86
|
+
</executions>
|
|
87
|
+
</plugin>
|
|
88
|
+
</plugins>
|
|
89
|
+
</build>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Multi-Module Project
|
|
93
|
+
|
|
94
|
+
```xml
|
|
95
|
+
<!-- Parent POM -->
|
|
96
|
+
<project>
|
|
97
|
+
<groupId>com.example</groupId>
|
|
98
|
+
<artifactId>parent</artifactId>
|
|
99
|
+
<version>1.0.0</version>
|
|
100
|
+
<packaging>pom</packaging>
|
|
101
|
+
|
|
102
|
+
<modules>
|
|
103
|
+
<module>core</module>
|
|
104
|
+
<module>api</module>
|
|
105
|
+
<module>web</module>
|
|
106
|
+
</modules>
|
|
107
|
+
|
|
108
|
+
<dependencyManagement>
|
|
109
|
+
<dependencies>
|
|
110
|
+
<!-- Centralize versions here -->
|
|
111
|
+
</dependencies>
|
|
112
|
+
</dependencyManagement>
|
|
113
|
+
</project>
|
|
114
|
+
```
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: GraalVM Native
|
|
3
|
+
description: Native image compilation, reflection configuration, and build optimization.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [java, graalvm, native, aot]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/*.java', 'native-image.properties', 'META-INF/native-image/**', 'pom.xml', 'build.gradle']
|
|
8
|
+
keywords: [GraalVM, native-image, reflection-config, reachability-metadata, '@RegisterForReflection']
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# GraalVM Native Standards
|
|
12
|
+
|
|
13
|
+
## Building Native Image
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Maven with Spring Boot
|
|
17
|
+
./mvnw -Pnative native:compile
|
|
18
|
+
|
|
19
|
+
# Maven with Quarkus
|
|
20
|
+
./mvnw package -Dnative
|
|
21
|
+
|
|
22
|
+
# Gradle
|
|
23
|
+
./gradlew nativeCompile
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Reflection Configuration
|
|
27
|
+
|
|
28
|
+
```java
|
|
29
|
+
// Quarkus - register for reflection
|
|
30
|
+
@RegisterForReflection
|
|
31
|
+
public class User {
|
|
32
|
+
private String name;
|
|
33
|
+
private String email;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Spring Boot - hints
|
|
37
|
+
@Configuration
|
|
38
|
+
@ImportRuntimeHints(MyRuntimeHints.class)
|
|
39
|
+
public class NativeConfig {}
|
|
40
|
+
|
|
41
|
+
public class MyRuntimeHints implements RuntimeHintsRegistrar {
|
|
42
|
+
@Override
|
|
43
|
+
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
|
|
44
|
+
hints.reflection().registerType(User.class,
|
|
45
|
+
MemberCategory.PUBLIC_FIELDS,
|
|
46
|
+
MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS,
|
|
47
|
+
MemberCategory.INVOKE_PUBLIC_METHODS);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Native Image Configuration Files
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
src/main/resources/META-INF/native-image/
|
|
56
|
+
├── reflect-config.json
|
|
57
|
+
├── resource-config.json
|
|
58
|
+
├── serialization-config.json
|
|
59
|
+
└── native-image.properties
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
// reflect-config.json
|
|
64
|
+
[
|
|
65
|
+
{
|
|
66
|
+
"name": "com.example.User",
|
|
67
|
+
"allDeclaredConstructors": true,
|
|
68
|
+
"allPublicMethods": true,
|
|
69
|
+
"allDeclaredFields": true
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
// resource-config.json
|
|
76
|
+
{
|
|
77
|
+
"resources": {
|
|
78
|
+
"includes": [
|
|
79
|
+
{"pattern": "application\\.yml"},
|
|
80
|
+
{"pattern": "db/migration/.*"}
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Performance Tips
|
|
87
|
+
|
|
88
|
+
```java
|
|
89
|
+
// Use build-time initialization
|
|
90
|
+
@BuildTimeInit
|
|
91
|
+
public class Constants {
|
|
92
|
+
public static final Map<String, String> CONFIG = loadConfig();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Avoid runtime class loading
|
|
96
|
+
// DON'T: Class.forName("com.example.MyClass")
|
|
97
|
+
// DO: Reference classes directly
|
|
98
|
+
|
|
99
|
+
// Use static configuration
|
|
100
|
+
// Avoid dynamic proxies when possible
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## References
|
|
104
|
+
|
|
105
|
+
- [Native Image Config](references/native-image-config.md) - Full configuration options
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# GraalVM Native References
|
|
2
|
+
|
|
3
|
+
## References
|
|
4
|
+
|
|
5
|
+
- [**Native Image Config**](native-image-config.md) - Reflection, resources, serialization config
|
|
6
|
+
|
|
7
|
+
## Quick Checks
|
|
8
|
+
|
|
9
|
+
- [ ] Register classes for reflection explicitly
|
|
10
|
+
- [ ] Include resource files in resource-config.json
|
|
11
|
+
- [ ] Avoid dynamic class loading
|
|
12
|
+
- [ ] Test native image in CI before release
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Java Collections & Streams
|
|
3
|
+
description: Collections framework, Stream API, functional interfaces, and Optional patterns.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [java, collections, streams, functional]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/*.java']
|
|
8
|
+
keywords: [List, Map, Set, Stream, Optional, Collector, Collectors, HashMap, ArrayList, LinkedList, TreeMap]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Java Collections & Streams Standards
|
|
12
|
+
|
|
13
|
+
## Collections Framework
|
|
14
|
+
|
|
15
|
+
```java
|
|
16
|
+
// Choose the right collection
|
|
17
|
+
List<String> list = new ArrayList<>(); // Random access, dynamic size
|
|
18
|
+
List<String> linked = new LinkedList<>(); // Frequent insertions/deletions
|
|
19
|
+
Set<String> set = new HashSet<>(); // Unique elements, O(1) lookup
|
|
20
|
+
Set<String> sorted = new TreeSet<>(); // Sorted unique elements
|
|
21
|
+
Map<K, V> map = new HashMap<>(); // Key-value pairs, O(1) lookup
|
|
22
|
+
Map<K, V> linked = new LinkedHashMap<>(); // Insertion order preserved
|
|
23
|
+
Map<K, V> tree = new TreeMap<>(); // Sorted by keys
|
|
24
|
+
|
|
25
|
+
// Immutable collections (Java 9+)
|
|
26
|
+
List<String> immutable = List.of("a", "b", "c");
|
|
27
|
+
Set<Integer> immutableSet = Set.of(1, 2, 3);
|
|
28
|
+
Map<String, Integer> immutableMap = Map.of("a", 1, "b", 2);
|
|
29
|
+
|
|
30
|
+
// Unmodifiable wrappers
|
|
31
|
+
List<String> unmodifiable = Collections.unmodifiableList(mutableList);
|
|
32
|
+
// Or with copyOf (Java 10+)
|
|
33
|
+
List<String> copy = List.copyOf(mutableList);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Stream API
|
|
37
|
+
|
|
38
|
+
```java
|
|
39
|
+
// Basic pipeline
|
|
40
|
+
List<String> result = items.stream()
|
|
41
|
+
.filter(item -> item.isActive())
|
|
42
|
+
.map(Item::getName)
|
|
43
|
+
.sorted()
|
|
44
|
+
.distinct()
|
|
45
|
+
.collect(Collectors.toList());
|
|
46
|
+
|
|
47
|
+
// Parallel streams (use with caution)
|
|
48
|
+
long count = largeList.parallelStream()
|
|
49
|
+
.filter(this::expensiveCheck)
|
|
50
|
+
.count();
|
|
51
|
+
|
|
52
|
+
// FlatMap for nested structures
|
|
53
|
+
List<String> allTags = posts.stream()
|
|
54
|
+
.flatMap(post -> post.getTags().stream())
|
|
55
|
+
.distinct()
|
|
56
|
+
.toList(); // Java 16+
|
|
57
|
+
|
|
58
|
+
// Reduce operations
|
|
59
|
+
int sum = numbers.stream()
|
|
60
|
+
.reduce(0, Integer::sum);
|
|
61
|
+
|
|
62
|
+
Optional<Integer> max = numbers.stream()
|
|
63
|
+
.reduce(Integer::max);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Collectors
|
|
67
|
+
|
|
68
|
+
```java
|
|
69
|
+
// Group by
|
|
70
|
+
Map<Status, List<Order>> byStatus = orders.stream()
|
|
71
|
+
.collect(Collectors.groupingBy(Order::getStatus));
|
|
72
|
+
|
|
73
|
+
// Group by with downstream collector
|
|
74
|
+
Map<Status, Long> countByStatus = orders.stream()
|
|
75
|
+
.collect(Collectors.groupingBy(
|
|
76
|
+
Order::getStatus,
|
|
77
|
+
Collectors.counting()
|
|
78
|
+
));
|
|
79
|
+
|
|
80
|
+
// Partition by predicate
|
|
81
|
+
Map<Boolean, List<User>> partitioned = users.stream()
|
|
82
|
+
.collect(Collectors.partitioningBy(User::isActive));
|
|
83
|
+
|
|
84
|
+
// To map
|
|
85
|
+
Map<String, User> byId = users.stream()
|
|
86
|
+
.collect(Collectors.toMap(
|
|
87
|
+
User::getId,
|
|
88
|
+
Function.identity(),
|
|
89
|
+
(existing, replacement) -> existing // Merge function
|
|
90
|
+
));
|
|
91
|
+
|
|
92
|
+
// Joining strings
|
|
93
|
+
String csv = items.stream()
|
|
94
|
+
.map(Item::getName)
|
|
95
|
+
.collect(Collectors.joining(", "));
|
|
96
|
+
|
|
97
|
+
// Statistics
|
|
98
|
+
IntSummaryStatistics stats = orders.stream()
|
|
99
|
+
.collect(Collectors.summarizingInt(Order::getQuantity));
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Optional
|
|
103
|
+
|
|
104
|
+
```java
|
|
105
|
+
// Return Optional for nullable results
|
|
106
|
+
public Optional<User> findById(String id) {
|
|
107
|
+
return Optional.ofNullable(repository.get(id));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Chain operations
|
|
111
|
+
String email = findById(id)
|
|
112
|
+
.filter(User::isActive)
|
|
113
|
+
.map(User::getEmail)
|
|
114
|
+
.orElse("unknown@example.com");
|
|
115
|
+
|
|
116
|
+
// Throw on absence
|
|
117
|
+
User user = findById(id)
|
|
118
|
+
.orElseThrow(() -> new UserNotFoundException(id));
|
|
119
|
+
|
|
120
|
+
// Conditional execution
|
|
121
|
+
findById(id).ifPresent(this::sendNotification);
|
|
122
|
+
|
|
123
|
+
// With fallback computation
|
|
124
|
+
User user = findById(id)
|
|
125
|
+
.orElseGet(() -> createDefaultUser());
|
|
126
|
+
|
|
127
|
+
// Stream of Optional (Java 9+)
|
|
128
|
+
List<User> activeUsers = ids.stream()
|
|
129
|
+
.map(this::findById)
|
|
130
|
+
.flatMap(Optional::stream)
|
|
131
|
+
.filter(User::isActive)
|
|
132
|
+
.toList();
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Best Practices
|
|
136
|
+
|
|
137
|
+
1. **Prefer immutable collections** from factories (List.of, Set.of, Map.of)
|
|
138
|
+
2. **Size collections** when capacity is known: `new ArrayList<>(100)`
|
|
139
|
+
3. **Use appropriate collection** for use case (HashMap vs TreeMap)
|
|
140
|
+
4. **Avoid null in collections** - use Optional or empty collections
|
|
141
|
+
5. **Stream once** - streams cannot be reused after terminal operation
|
|
142
|
+
6. **Parallel streams carefully** - only for CPU-bound, large datasets
|
|
143
|
+
7. **Optional for returns only** - never as fields or parameters
|
|
144
|
+
|
|
145
|
+
## References
|
|
146
|
+
|
|
147
|
+
- [Stream Pipelines](references/stream-pipelines.md) - Advanced stream patterns
|
|
148
|
+
- [Collectors Patterns](references/collectors-patterns.md) - Custom collectors, complex aggregations
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Java Collections & Streams References
|
|
2
|
+
|
|
3
|
+
## References
|
|
4
|
+
|
|
5
|
+
- [**Stream Pipelines**](stream-pipelines.md) - Advanced stream operations, lazy evaluation, short-circuiting
|
|
6
|
+
- [**Collectors Patterns**](collectors-patterns.md) - Custom collectors, complex aggregations, downstream collectors
|
|
7
|
+
|
|
8
|
+
## Quick Checks
|
|
9
|
+
|
|
10
|
+
- [ ] Use List.of/Set.of/Map.of for immutable collections
|
|
11
|
+
- [ ] Size ArrayList/HashMap when capacity known
|
|
12
|
+
- [ ] Stream once - don't reuse after terminal operation
|
|
13
|
+
- [ ] Parallel streams only for large, CPU-bound operations
|
|
14
|
+
- [ ] Optional for return types, never parameters or fields
|
|
15
|
+
- [ ] Avoid nulls in collections - use empty collections instead
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Collectors Patterns
|
|
2
|
+
|
|
3
|
+
## Built-in Collectors
|
|
4
|
+
|
|
5
|
+
```java
|
|
6
|
+
// toList, toSet, toCollection
|
|
7
|
+
List<String> list = stream.collect(Collectors.toList());
|
|
8
|
+
Set<String> set = stream.collect(Collectors.toSet());
|
|
9
|
+
TreeSet<String> treeSet = stream.collect(Collectors.toCollection(TreeSet::new));
|
|
10
|
+
|
|
11
|
+
// Java 16+ shorthand
|
|
12
|
+
List<String> list = stream.toList(); // Returns unmodifiable list
|
|
13
|
+
|
|
14
|
+
// toMap with merge function
|
|
15
|
+
Map<String, User> userById = users.stream()
|
|
16
|
+
.collect(Collectors.toMap(
|
|
17
|
+
User::getId,
|
|
18
|
+
Function.identity(),
|
|
19
|
+
(existing, replacement) -> existing, // Keep existing on duplicate
|
|
20
|
+
LinkedHashMap::new // Maintain insertion order
|
|
21
|
+
));
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Grouping Collectors
|
|
25
|
+
|
|
26
|
+
```java
|
|
27
|
+
// Simple groupingBy
|
|
28
|
+
Map<Department, List<Employee>> byDept = employees.stream()
|
|
29
|
+
.collect(Collectors.groupingBy(Employee::getDepartment));
|
|
30
|
+
|
|
31
|
+
// With downstream collector
|
|
32
|
+
Map<Department, Long> countByDept = employees.stream()
|
|
33
|
+
.collect(Collectors.groupingBy(
|
|
34
|
+
Employee::getDepartment,
|
|
35
|
+
Collectors.counting()
|
|
36
|
+
));
|
|
37
|
+
|
|
38
|
+
// Nested grouping
|
|
39
|
+
Map<Department, Map<Level, List<Employee>>> nested = employees.stream()
|
|
40
|
+
.collect(Collectors.groupingBy(
|
|
41
|
+
Employee::getDepartment,
|
|
42
|
+
Collectors.groupingBy(Employee::getLevel)
|
|
43
|
+
));
|
|
44
|
+
|
|
45
|
+
// GroupingBy with mapping
|
|
46
|
+
Map<Department, Set<String>> namesByDept = employees.stream()
|
|
47
|
+
.collect(Collectors.groupingBy(
|
|
48
|
+
Employee::getDepartment,
|
|
49
|
+
Collectors.mapping(
|
|
50
|
+
Employee::getName,
|
|
51
|
+
Collectors.toSet()
|
|
52
|
+
)
|
|
53
|
+
));
|
|
54
|
+
|
|
55
|
+
// GroupingBy with reducing
|
|
56
|
+
Map<Department, Optional<Employee>> highestPaid = employees.stream()
|
|
57
|
+
.collect(Collectors.groupingBy(
|
|
58
|
+
Employee::getDepartment,
|
|
59
|
+
Collectors.maxBy(Comparator.comparing(Employee::getSalary))
|
|
60
|
+
));
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Partitioning
|
|
64
|
+
|
|
65
|
+
```java
|
|
66
|
+
// Simple partition
|
|
67
|
+
Map<Boolean, List<User>> partition = users.stream()
|
|
68
|
+
.collect(Collectors.partitioningBy(User::isActive));
|
|
69
|
+
|
|
70
|
+
List<User> active = partition.get(true);
|
|
71
|
+
List<User> inactive = partition.get(false);
|
|
72
|
+
|
|
73
|
+
// Partition with downstream
|
|
74
|
+
Map<Boolean, Long> counts = users.stream()
|
|
75
|
+
.collect(Collectors.partitioningBy(
|
|
76
|
+
User::isActive,
|
|
77
|
+
Collectors.counting()
|
|
78
|
+
));
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Aggregation Collectors
|
|
82
|
+
|
|
83
|
+
```java
|
|
84
|
+
// Statistics
|
|
85
|
+
IntSummaryStatistics stats = orders.stream()
|
|
86
|
+
.collect(Collectors.summarizingInt(Order::getQuantity));
|
|
87
|
+
// stats.getSum(), stats.getAverage(), stats.getMax(), stats.getMin(), stats.getCount()
|
|
88
|
+
|
|
89
|
+
// Sum with mapping
|
|
90
|
+
int totalQuantity = orders.stream()
|
|
91
|
+
.collect(Collectors.summingInt(Order::getQuantity));
|
|
92
|
+
|
|
93
|
+
// Average
|
|
94
|
+
Double avgSalary = employees.stream()
|
|
95
|
+
.collect(Collectors.averagingDouble(Employee::getSalary));
|
|
96
|
+
|
|
97
|
+
// Max/Min
|
|
98
|
+
Optional<Employee> highest = employees.stream()
|
|
99
|
+
.collect(Collectors.maxBy(Comparator.comparing(Employee::getSalary)));
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Joining Collector
|
|
103
|
+
|
|
104
|
+
```java
|
|
105
|
+
// Simple join
|
|
106
|
+
String csv = names.stream()
|
|
107
|
+
.collect(Collectors.joining(", "));
|
|
108
|
+
|
|
109
|
+
// With prefix and suffix
|
|
110
|
+
String json = items.stream()
|
|
111
|
+
.map(Item::toJson)
|
|
112
|
+
.collect(Collectors.joining(",\n", "[\n", "\n]"));
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Custom Collectors
|
|
116
|
+
|
|
117
|
+
```java
|
|
118
|
+
// Collector.of pattern
|
|
119
|
+
Collector<Person, ?, ImmutableList<Person>> toImmutableList =
|
|
120
|
+
Collector.of(
|
|
121
|
+
ImmutableList::<Person>builder, // Supplier
|
|
122
|
+
ImmutableList.Builder::add, // Accumulator
|
|
123
|
+
(b1, b2) -> b1.addAll(b2.build()), // Combiner
|
|
124
|
+
ImmutableList.Builder::build // Finisher
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// Using collectingAndThen for transformation
|
|
128
|
+
List<User> unmodifiable = users.stream()
|
|
129
|
+
.collect(Collectors.collectingAndThen(
|
|
130
|
+
Collectors.toList(),
|
|
131
|
+
Collections::unmodifiableList
|
|
132
|
+
));
|
|
133
|
+
|
|
134
|
+
// Teeing collector (Java 12+) - two collectors at once
|
|
135
|
+
record MinMax(int min, int max) {}
|
|
136
|
+
|
|
137
|
+
MinMax result = numbers.stream()
|
|
138
|
+
.collect(Collectors.teeing(
|
|
139
|
+
Collectors.minBy(Comparator.naturalOrder()),
|
|
140
|
+
Collectors.maxBy(Comparator.naturalOrder()),
|
|
141
|
+
(min, max) -> new MinMax(
|
|
142
|
+
min.orElse(0),
|
|
143
|
+
max.orElse(0)
|
|
144
|
+
)
|
|
145
|
+
));
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Filtering Collector (Java 9+)
|
|
149
|
+
|
|
150
|
+
```java
|
|
151
|
+
// Filter within grouping
|
|
152
|
+
Map<Department, List<Employee>> seniorByDept = employees.stream()
|
|
153
|
+
.collect(Collectors.groupingBy(
|
|
154
|
+
Employee::getDepartment,
|
|
155
|
+
Collectors.filtering(
|
|
156
|
+
e -> e.getYearsOfService() > 5,
|
|
157
|
+
Collectors.toList()
|
|
158
|
+
)
|
|
159
|
+
));
|
|
160
|
+
|
|
161
|
+
// vs filter before grouping (different semantics)
|
|
162
|
+
// filtering: includes all departments, even with empty lists
|
|
163
|
+
// filter: excludes departments with no matching employees
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## FlatMapping Collector (Java 9+)
|
|
167
|
+
|
|
168
|
+
```java
|
|
169
|
+
// FlatMap within grouping
|
|
170
|
+
Map<Author, Set<String>> tagsByAuthor = posts.stream()
|
|
171
|
+
.collect(Collectors.groupingBy(
|
|
172
|
+
Post::getAuthor,
|
|
173
|
+
Collectors.flatMapping(
|
|
174
|
+
post -> post.getTags().stream(),
|
|
175
|
+
Collectors.toSet()
|
|
176
|
+
)
|
|
177
|
+
));
|
|
178
|
+
```
|