src/share/classes/java/lang/CharSequence.java

Print this page
rev 7005 : 8012665: CharSequence.chars, CharSequence.codePoints
Reviewed-by:
Contributed-by: smarks

*** 1,7 **** /* ! * Copyright (c) 2000, 2011, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 23,32 **** --- 23,39 ---- * questions. */ 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 <tt>CharSequence</tt> is a readable sequence of <code>char</code> values. This * interface provides uniform, read-only access to many different kinds of * <code>char</code> sequences.
*** 106,111 **** --- 113,209 ---- * * @return a string consisting of exactly this sequence of characters */ public String toString(); + /** + * Returns a stream of {@code int} zero-extending the {@code char} values + * from this sequence. Any char which maps to a <a + * href="{@docRoot}/java/lang/Character.html#unicode">surrogate code + * point</a> is passed through uninterpreted. + * + * <p>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. + * + * <p>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); + } }