1
1
package dev .openfeature .sdk ;
2
2
3
+ import java .util .ArrayList ;
4
+ import java .util .Collections ;
3
5
import java .util .List ;
4
6
import java .util .Map ;
5
- import java .util .Objects ;
6
7
import java .util .Optional ;
7
8
import java .util .function .Consumer ;
8
- import java .util .stream .Collectors ;
9
- import java .util .stream .IntStream ;
10
- import java .util .stream .Stream ;
11
9
12
10
import lombok .RequiredArgsConstructor ;
13
11
import lombok .extern .slf4j .Slf4j ;
@@ -19,11 +17,7 @@ class HookSupport {
19
17
20
18
public EvaluationContext beforeHooks (FlagValueType flagValueType , HookContext hookCtx , List <Hook > hooks ,
21
19
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 );
27
21
}
28
22
29
23
public void afterHooks (FlagValueType flagValueType , HookContext hookContext , FlagEvaluationDetails details ,
@@ -46,10 +40,11 @@ private <T> void executeHooks(
46
40
String hookMethod ,
47
41
Consumer <Hook <T >> hookCode ) {
48
42
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
+ }
53
48
}
54
49
}
55
50
@@ -68,29 +63,29 @@ private <T> void executeHooksUnchecked(
68
63
FlagValueType flagValueType , List <Hook > hooks ,
69
64
Consumer <Hook <T >> hookCode ) {
70
65
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
+ }
75
71
}
76
72
}
77
73
78
- private Stream < EvaluationContext > callBeforeHooks (FlagValueType flagValueType , HookContext hookCtx ,
74
+ private EvaluationContext callBeforeHooks (FlagValueType flagValueType , HookContext hookCtx ,
79
75
List <Hook > hooks , Map <String , Object > hints ) {
80
76
// 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 ;
95
90
}
96
91
}
0 commit comments