@@ -30,6 +30,24 @@ protected Set<Entry<K, V>> initialValue() {
3030 return new HashSet <>();
3131 }
3232 };
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+ };
3351
3452 @ Override
3553 public int size () {
@@ -105,9 +123,9 @@ public Set<K> keySet() {
105123 try {
106124 result .clear ();
107125 //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 );
111129 } finally {
112130 lock .unlockRead ();
113131 }
@@ -121,9 +139,9 @@ public Collection<V> values() {
121139 try {
122140 result .clear ();
123141 //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 );
127145 } finally {
128146 lock .unlockRead ();
129147 }
@@ -137,9 +155,9 @@ public Set<Entry<K, V>> entrySet() {
137155 try {
138156 result .clear ();
139157 //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 );
143161 } finally {
144162 lock .unlockRead ();
145163 }
0 commit comments