Mercurial > hg > openjdk > lambda > jdk
changeset 7544:575749b77035
restore lambda bits lost in jsr166 merge
Contributed-by: akhil.arora@oracle.com
author | mduigou |
---|---|
date | Wed, 27 Feb 2013 16:50:35 -0800 |
parents | dbb23cb1711d |
children | af323ffe1aa7 |
files | src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java test/java/util/CollectionExtensionMethods/testlibrary/CollectionAsserts.java |
diffstat | 2 files changed, 92 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Wed Feb 27 16:47:51 2013 -0800 +++ b/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Wed Feb 27 16:50:35 2013 -0800 @@ -46,7 +46,9 @@ package java.util.concurrent; import java.util.AbstractList; import java.util.Arrays; +import java.util.BitSet; import java.util.Collection; +import java.util.Comparator; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; @@ -56,6 +58,9 @@ import java.util.Spliterator; import java.util.Spliterators; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import java.util.stream.Streams; @@ -1388,4 +1393,83 @@ throw new Error(e); } } + + @SuppressWarnings("unchecked") + public void forEach(Consumer<? super E> consumer) { + final Object[] elements = getArray(); + for (final Object element : elements) { + consumer.accept((E) element); + } + } + + @Override + public void sort(Comparator<? super E> c) { + final ReentrantLock lock = this.lock; + lock.lock(); + try { + @SuppressWarnings("unchecked") + E[] elements = (E[]) getArray(); + E[] newElements = Arrays.copyOf(elements, elements.length); + Arrays.sort(newElements, c); + setArray(newElements); + } finally { + lock.unlock(); + } + } + + @Override + public boolean removeAll(Predicate<? super E> filter) { + final ReentrantLock lock = this.lock; + lock.lock(); + try { + @SuppressWarnings("unchecked") + final E[] elements = (E[]) getArray(); + + // figure out which elements are to be removed + // any exception thrown from the filter predicate at this stage + // will leave the collection unmodified + final BitSet removeSet = new BitSet(elements.length); + for (int i=0; i < elements.length; i++) { + final E element = elements[i]; + if (filter.test(element)) { + removeSet.set(i); + } + } + + // copy surviving elements into a new array + final boolean anyToRemove = (removeSet != null) && !removeSet.isEmpty(); + if (anyToRemove) { + final int newSize = elements.length - removeSet.cardinality(); + final Object[] newElements = new Object[newSize]; + for (int i=0, j=0; (i < elements.length) && (j < newSize); i++, j++) { + i = removeSet.nextClearBit(i); + newElements[j] = elements[i]; + } + setArray(newElements); + } + + return anyToRemove; + } finally { + lock.unlock(); + } + } + + @Override + public void replaceAll(UnaryOperator<E> operator) { + final ReentrantLock lock = this.lock; + lock.lock(); + try { + @SuppressWarnings("unchecked") + final E[] elements = (E[]) getArray(); + final int len = elements.length; + @SuppressWarnings("unchecked") + final E[] newElements = (E[]) new Object[len]; + for (int i=0; i < len; i++) { + newElements[i] = operator.apply(elements[i]); + } + setArray(newElements); + } finally { + lock.unlock(); + } + } }
--- a/test/java/util/CollectionExtensionMethods/testlibrary/CollectionAsserts.java Wed Feb 27 16:47:51 2013 -0800 +++ b/test/java/util/CollectionExtensionMethods/testlibrary/CollectionAsserts.java Wed Feb 27 16:50:35 2013 -0800 @@ -23,7 +23,15 @@ * questions. */ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; import java.util.Iterator; +import java.util.List; +import java.util.Objects; +import java.util.Set; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue;