11package dev .openfeature .sdk ;
22
3+ import java .util .ArrayList ;
4+ import java .util .Collections ;
35import java .util .List ;
46import java .util .Map ;
5- import java .util .Objects ;
67import java .util .Optional ;
78import java .util .function .Consumer ;
8- import java .util .stream .Collectors ;
9- import java .util .stream .IntStream ;
10- import java .util .stream .Stream ;
119
1210import lombok .RequiredArgsConstructor ;
1311import lombok .extern .slf4j .Slf4j ;
@@ -19,11 +17,7 @@ class HookSupport {
1917
2018 public EvaluationContext beforeHooks (FlagValueType flagValueType , HookContext hookCtx , List <Hook > hooks ,
2119 Map <String , Object > hints ) {
22- Stream <EvaluationContext > result = callBeforeHooks (flagValueType , hookCtx , hooks , hints );
23- return hookCtx .getCtx ().merge (
24- result .reduce (hookCtx .getCtx (), (EvaluationContext accumulated , EvaluationContext current ) -> {
25- return accumulated .merge (current );
26- }));
20+ return callBeforeHooks (flagValueType , hookCtx , hooks , hints );
2721 }
2822
2923 public void afterHooks (FlagValueType flagValueType , HookContext hookContext , FlagEvaluationDetails details ,
@@ -46,10 +40,11 @@ private <T> void executeHooks(
4640 String hookMethod ,
4741 Consumer <Hook <T >> hookCode ) {
4842 if (hooks != null ) {
49- hooks
50- .stream ()
51- .filter (hook -> hook .supportsFlagValueType (flagValueType ))
52- .forEach (hook -> executeChecked (hook , hookCode , hookMethod ));
43+ for (Hook hook : hooks ) {
44+ if (hook .supportsFlagValueType (flagValueType )) {
45+ executeChecked (hook , hookCode , hookMethod );
46+ }
47+ }
5348 }
5449 }
5550
@@ -68,29 +63,29 @@ private <T> void executeHooksUnchecked(
6863 FlagValueType flagValueType , List <Hook > hooks ,
6964 Consumer <Hook <T >> hookCode ) {
7065 if (hooks != null ) {
71- hooks
72- .stream ()
73- .filter (hook -> hook .supportsFlagValueType (flagValueType ))
74- .forEach (hookCode ::accept );
66+ for (Hook hook : hooks ) {
67+ if (hook .supportsFlagValueType (flagValueType )) {
68+ hookCode .accept (hook );
69+ }
70+ }
7571 }
7672 }
7773
78- private Stream < EvaluationContext > callBeforeHooks (FlagValueType flagValueType , HookContext hookCtx ,
74+ private EvaluationContext callBeforeHooks (FlagValueType flagValueType , HookContext hookCtx ,
7975 List <Hook > hooks , Map <String , Object > hints ) {
8076 // These traverse backwards from normal.
81- List <Hook > reversedHooks = IntStream
82- .range (0 , hooks .size ())
83- .map (i -> hooks .size () - 1 - i )
84- .mapToObj (hooks ::get )
85- .collect (Collectors .toList ());
86-
87- return reversedHooks
88- .stream ()
89- .filter (hook -> hook .supportsFlagValueType (flagValueType ))
90- .map (hook -> hook .before (hookCtx , hints ))
91- .filter (Objects ::nonNull )
92- .filter (Optional ::isPresent )
93- .map (Optional ::get )
94- .map (EvaluationContext .class ::cast );
77+ List <Hook > reversedHooks = new ArrayList <>(hooks );
78+ Collections .reverse (reversedHooks );
79+ EvaluationContext context = hookCtx .getCtx ();
80+ for (Hook hook : reversedHooks ) {
81+ if (hook .supportsFlagValueType (flagValueType )) {
82+ Optional <EvaluationContext > optional = Optional .ofNullable (hook .before (hookCtx , hints ))
83+ .orElse (Optional .empty ());
84+ if (optional .isPresent ()) {
85+ context = context .merge (optional .get ());
86+ }
87+ }
88+ }
89+ return context ;
9590 }
9691}
0 commit comments