--- old/src/share/classes/java/lang/CharSequence.java 2013-04-25 14:43:58.828793665 -0700
+++ new/src/share/classes/java/lang/CharSequence.java 2013-04-25 14:43:58.680793669 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,13 @@
package java.lang;
+import java.util.NoSuchElementException;
+import java.util.PrimitiveIterator;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.function.IntConsumer;
+import java.util.stream.IntStream;
+import java.util.stream.StreamSupport;
/**
* A CharSequence is a readable sequence of char
values. This
@@ -108,4 +115,95 @@
*/
public String toString();
+ /**
+ * Returns a stream of {@code int} zero-extending the {@code char} values
+ * from this sequence. Any char which maps to a surrogate code
+ * point is passed through uninterpreted.
+ *
+ *
If the sequence is mutated while the stream is being read, the + * result is undefined. + * + * @return an IntStream of char values from this sequence + * @since 1.8 + */ + public default IntStream chars() { + class CharIterator implements PrimitiveIterator.OfInt { + int cur = 0; + + public boolean hasNext() { + return cur < length(); + } + + public int nextInt() { + if (hasNext()) { + return charAt(cur++); + } else { + throw new NoSuchElementException(); + } + } + + @Override + public void forEachRemaining(IntConsumer block) { + for (; cur < length(); cur++) { + block.accept(charAt(cur)); + } + } + } + + return StreamSupport.intStream(() -> + Spliterators.spliterator( + new CharIterator(), + length(), + Spliterator.ORDERED), + Spliterator.SUBSIZED | Spliterator.SIZED | Spliterator.ORDERED); + } + + /** + * Returns a stream of code point values from this sequence. Any surrogate + * pairs encountered in the sequence are combined as if by {@linkplain + * Character#toCodePoint Character.toCodePoint} and the result is passed + * to the stream. Any other code units, including ordinary BMP characters, + * unpaired surrogates, and undefined code units, are zero-extended to + * {@code int} values which are then passed to the stream. + * + *
If the sequence is mutated while the stream is being read, the result
+ * is undefined.
+ *
+ * @return an IntStream of Unicode code points from this sequence
+ * @since 1.8
+ */
+ public default IntStream codePoints() {
+ class CodePointIterator implements PrimitiveIterator.OfInt {
+ int cur = 0;
+
+ @Override
+ public void forEachRemaining(IntConsumer block) {
+ while (cur < length()) {
+ int cp = Character.codePointAt(CharSequence.this, cur);
+ cur += Character.charCount(cp);
+ block.accept(cp);
+ }
+ }
+
+ public boolean hasNext() {
+ return cur < length();
+ }
+
+ public int nextInt() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+ int cp = Character.codePointAt(CharSequence.this, cur);
+ cur += Character.charCount(cp);
+ return cp;
+ }
+ }
+
+ return StreamSupport.intStream(() ->
+ Spliterators.spliteratorUnknownSize(
+ new CodePointIterator(),
+ Spliterator.ORDERED),
+ Spliterator.SUBSIZED | Spliterator.SIZED | Spliterator.ORDERED);
+ }
}
--- old/test/java/lang/StringBuffer/TestSynchronization.java 2013-04-25 14:43:59.640793652 -0700
+++ new/test/java/lang/StringBuffer/TestSynchronization.java 2013-04-25 14:43:59.484793653 -0700
@@ -96,6 +96,11 @@
// the right thing.
List