@@ -30,6 +30,24 @@ protected Set<Entry<K, V>> initialValue() {
30
30
return new HashSet <>();
31
31
}
32
32
};
33
+ private final ThreadLocal <ToSetConsumer <K >> keyConsumer = new ThreadLocal <ToSetConsumer <K >>() {
34
+ @ Override
35
+ protected ToSetConsumer <K > initialValue () {
36
+ return new ToSetConsumer <K >();
37
+ }
38
+ };
39
+ private final ThreadLocal <ToCollectionConsumer <V >> valueConsumer = new ThreadLocal <ToCollectionConsumer <V >>() {
40
+ @ Override
41
+ protected ToCollectionConsumer <V > initialValue () {
42
+ return new ToCollectionConsumer <V >();
43
+ }
44
+ };
45
+ private final ThreadLocal <ToSetConsumer <Entry <K , V >>> entryConsumer = new ThreadLocal <ToSetConsumer <Entry <K , V >>>() {
46
+ @ Override
47
+ protected ToSetConsumer <Entry <K , V >> initialValue () {
48
+ return new ToSetConsumer <Entry <K , V >>();
49
+ }
50
+ };
33
51
34
52
@ Override
35
53
public int size () {
@@ -105,9 +123,9 @@ public Set<K> keySet() {
105
123
try {
106
124
result .clear ();
107
125
//addAll allocates arrays unnecessarily
108
- internalMap . keySet (). forEach (( key ) -> {
109
- result . add ( key );
110
- } );
126
+ final ToSetConsumer < K > consumer = keyConsumer . get ();
127
+ consumer . setSet ( result );
128
+ internalMap . keySet (). forEach ( consumer );
111
129
} finally {
112
130
lock .unlockRead ();
113
131
}
@@ -121,9 +139,9 @@ public Collection<V> values() {
121
139
try {
122
140
result .clear ();
123
141
//addAll allocates arrays unnecessarily
124
- internalMap . values (). forEach (( val ) -> {
125
- result . add ( val );
126
- } );
142
+ final ToCollectionConsumer < V > consumer = valueConsumer . get ();
143
+ consumer . setCollection ( result );
144
+ internalMap . values (). forEach ( consumer );
127
145
} finally {
128
146
lock .unlockRead ();
129
147
}
@@ -137,9 +155,9 @@ public Set<Entry<K, V>> entrySet() {
137
155
try {
138
156
result .clear ();
139
157
//addAll allocates arrays unnecessarily
140
- internalMap . entrySet (). forEach (( entry ) -> {
141
- result . add ( entry );
142
- } );
158
+ final ToSetConsumer < Entry < K , V >> consumer = entryConsumer . get ();
159
+ consumer . setSet ( result );
160
+ internalMap . entrySet (). forEach ( consumer );
143
161
} finally {
144
162
lock .unlockRead ();
145
163
}
0 commit comments