torutkのブログ

ソフトウェア・エンジニアのブログ

Java Advent Calendar 2013 11日目 - Java SE 8の新クラス・メソッド一覧

2013年のJava Adventカレンダーの11日目のエントリーです。
前日のエントリーは、Satoyuki Tsukanoさんのtwitterとelasticsearchを簡単に連携させる(Apache Camel入門 その2 コンポーネントについて) - Taste of Tech Topics
明日はkisさんです。

はじめに

メジャーバージョンアップとなるJava SE 8が年明けの3月に正式版リリース(GA:General Availability)を迎えます。メジャーバージョンアップでは、目玉機能には注目が集まるのであちこちでその内容が紹介されます。たとえば、Java SE 8ではラムダ式とStream API、Date and Time APIなどが目玉機能となります。これらの記事はすでにあちこちで見かけますね。

一方、既存APIへのクラス・メソッドの追加は地味なので注目があつまることがありません。そのため、Javaのメジャーバージョンアップ後しばらくして、「ほーぉ、こんなクラス/メソッドが追加されてたのかぁ〜、知らなかったなぁ、使っていたら便利だったのにぃ」ということがあります。

Java SEのメジャーバージョンのJSRには、文書として追加・変更・削除のあったクラスやメソッドのJavadoc形式のAPI文書差分情報が付属文書として提供されています。

  • Java SE 7の場合は、JSR 336 Annex 2
  • Java SE 8の場合は、JSR 337 Annex 2

JSR 336 Annex 2の見方については、こちらに少々説明を書いています。

このAnnex 2の資料は、Javadoc形式の差分情報なのでパッケージ > クラス > メソッドとドリルダウンしていく必要があり、また、Javadoc文書の記述修正も変更に含まれるので、追加されたメソッドの一覧を知ろうとするには少々不向きです。

そこで、Java SE 8の早期アクセス版JDKに付属のsrc.zipを対象に、Java SE 8で追加されたクラス・メソッドの一覧をjavadocのカスタムDocletを作って抽出する作業を実施しました。

以前にJava SE 7で同様の作業をしたときの内容は次のブログに記載しています。
カスタムJavadocとJDK 7で新しく導入されたクラス・メソッド - torutkの日記

Java SE 8(JDK 8)のsrc.zipを展開し、@sinceを探ってみる

JDK 8の早期アクセス版(b117)をインストールし、含まれるsrc.zipを展開します。
次に、javadocコメントの@sinceタグを抽出し、記載されるパターンを識別します。ここから、Java SE 8を示す記載パターンを特定します。

この手の作業は、シェルスクリプトgrepsedなどで組むと簡単なので、以下にWindows 7上でCygwinのコマンドを使って実行した内容を示します。

work$ unzip /java/jdk1.8.0/src.zip
work$ find . -name "*.java" | xargs sed -n 's/^.*\(@since\)[ ]*\([^ ].*\)$/\1 \2/p' | sort | uniq
@since ")
@since , @author, @version.
@since : 1.5
@since 1. 0
@since 1.0
@since 1.0.
@since 1.0.2
@since 1.02
@since 1.1
@since 1.1.4
@since 1.2
@since 1.2 */
@since 1.2. Doesn't exist in earlier
@since 1.2.2
@since 1.3
@since 1.3 */
@since 1.4
@since 1.5
@since 1.6
@since 1.7
@since 1.8
@since 2.0
@since 2.1
@since 2.2
@since 6.0
@since 7.0
@since 8
@since block tag.
@since Common Annotations 1.0
@since Common Annotations 1.1
@since DOM   Level 2
@since DOM Level 2
@since DOM Level 3
@since DOM Level 3 Core
@since J2SE 1.5
@since JAXB 2.0
@since JAXB 2.1
@since JAXB 2.2
@since JAXB1.0
@since JAXB2.0
@since JAXB2.1
@since JAX-WS 2.0
@since JAX-WS 2.1
@since JAX-WS 2.2
@since JDK 1.0.2
@since JDK 1.1
@since JDK 1.1.6
@since JDK 1.2
@since JDK1
@since JDK1. 0
@since JDK1.0
@since JDK1.0.
@since JDK1.0.2
@since JDK1.0t.
@since JDK1.1
@since JDK1.1.4
@since JDK1.1.6
@since JDK1.2
@since JDK1.3
@since JDK1.4
@since JDK1.8
@since JNDI 1.1 / Java 2 Platform, Standard Edition, v 1.3
@since May 23, 2001
@since May 24, 2001
@since PR-DOM-Level-1-19980818.
@since SAAJ 1.2
@since SAAJ 1.3
@since SAX 1.0
@since SAX 2.0
@since SAX 2.0 (extensions 1.0)
@since SAX 2.0 (extensions 1.1 alpha)
@since SAX 2.0.2
@since SAX 2.1alpha
@since tag.
@since WD-DOM-Level-2-19990719
@since WD-DOM-Level-2-19990923
@since XalanJ2
@since Xerces 2.2.0

この中で、Java SE 8で追加されたことを指定するものには、次が該当すると思われます。

@since 1.8
@since 8
@since JDK1.8

Javadoc Docletのプログラミング

では実際に@since 1.8、@since 8、@since JDK1.8のいずれかが含まれるJavadocコメントを持つクラスないしメソッドを抽出するDocletプログラムを書いてみます。

ソースコードGitHubのGistに掲げています。

Javadoc Docletの実行

JDK 8のsrc.zipを展開します。
展開したディレクトリへカレントディレクトリを移動します。
作成したDocletクラスがC:\Users\torutk\Documents\java\MyDocletsの下のbuild\classes以下にパッケージ名に応じて生成されたとして、次のコマンドラインで実行します。

work$ javadoc -docletpath c:/Users/torutk/Documents/java/MyDoclets/build/classes \
-doclet jp.gr.java_conf.torutk.doclets.ListBySinceDoclet -subpackages java:javax:org

なお、Java SE 8のソースコードを解析するのでJava SE 8で実行する必要があります。

実行結果

実行してみると、いくつか興味深いクラス、メソッドが見つかります。リストの最初の方からいくつか一例を掲げると

  • java.io.UncheckedIOException
  • java.lang.Stringクラスのjoinメソッド(指定したデリミターで指定した文字列を結合)
  • java.lang.ShortクラスのtoUnsignedIntメソッド(符号なし整数化)
  • java.lang.ProcessクラスのisAliveメソッド(プロセスが生きているか検査)

などがあります。

以下が実行結果の一覧となります。

java.awt.KeyboardFocusManager#clearFocusOwner
java.io.UncheckedIOException [class]
java.io.BufferedReader#lines
java.lang.ThreadLocal#withInitial
java.lang.String#join
java.lang.String#join
java.lang.StrictMath#addExact
java.lang.StrictMath#addExact
java.lang.StrictMath#subtractExact
java.lang.StrictMath#subtractExact
java.lang.StrictMath#multiplyExact
java.lang.StrictMath#multiplyExact
java.lang.StrictMath#toIntExact
java.lang.StrictMath#floorDiv
java.lang.StrictMath#floorDiv
java.lang.StrictMath#floorMod
java.lang.StrictMath#floorMod
java.lang.StrictMath#nextDown
java.lang.StrictMath#nextDown
java.lang.Short#hashCode
java.lang.Short#toUnsignedInt
java.lang.Short#toUnsignedLong
java.lang.Process#waitFor
java.lang.Process#destroyForcibly
java.lang.Process#isAlive
java.lang.Package#getAnnotationsByType
java.lang.Package#getDeclaredAnnotation
java.lang.Package#getDeclaredAnnotationsByType
java.lang.Math#addExact
java.lang.Math#addExact
java.lang.Math#subtractExact
java.lang.Math#subtractExact
java.lang.Math#multiplyExact
java.lang.Math#multiplyExact
java.lang.Math#incrementExact
java.lang.Math#incrementExact
java.lang.Math#decrementExact
java.lang.Math#decrementExact
java.lang.Math#negateExact
java.lang.Math#negateExact
java.lang.Math#toIntExact
java.lang.Math#floorDiv
java.lang.Math#floorDiv
java.lang.Math#floorMod
java.lang.Math#floorMod
java.lang.Math#nextDown
java.lang.Math#nextDown
java.lang.Long#toUnsignedString
java.lang.Long#toUnsignedString
java.lang.Long#parseUnsignedLong
java.lang.Long#parseUnsignedLong
java.lang.Long#hashCode
java.lang.Long#compareUnsigned
java.lang.Long#divideUnsigned
java.lang.Long#remainderUnsigned
java.lang.Long#sum
java.lang.Long#max
java.lang.Long#min
java.lang.Iterable#forEach
java.lang.Iterable#spliterator
java.lang.Integer#toUnsignedString
java.lang.Integer#toUnsignedString
java.lang.Integer#parseUnsignedInt
java.lang.Integer#parseUnsignedInt
java.lang.Integer#hashCode
java.lang.Integer#compareUnsigned
java.lang.Integer#toUnsignedLong
java.lang.Integer#divideUnsigned
java.lang.Integer#remainderUnsigned
java.lang.Integer#sum
java.lang.Integer#max
java.lang.Integer#min
java.lang.FunctionalInterface [class]
java.lang.Float#isFinite
java.lang.Float#hashCode
java.lang.Float#sum
java.lang.Float#max
java.lang.Float#min
java.lang.Double#isFinite
java.lang.Double#hashCode
java.lang.Double#sum
java.lang.Double#max
java.lang.Double#min
java.lang.Class#toGenericString
java.lang.Class#getTypeName
java.lang.Class#getAnnotationsByType
java.lang.Class#getDeclaredAnnotation
java.lang.Class#getDeclaredAnnotationsByType
java.lang.Class#getAnnotatedSuperclass
java.lang.Class#getAnnotatedInterfaces
java.lang.Character#hashCode
java.lang.CharSequence#chars
java.lang.CharSequence#codePoints
java.lang.Byte#hashCode
java.lang.Byte#toUnsignedInt
java.lang.Byte#toUnsignedLong
java.lang.Boolean#hashCode
java.lang.Boolean#logicalAnd
java.lang.Boolean#logicalOr
java.lang.Boolean#logicalXor
java.lang.annotation.Repeatable [class]
java.lang.annotation.Native [class]
java.lang.invoke.MethodHandles#reflectAs
java.lang.invoke.MethodHandles.Lookup#revealDirect
java.lang.invoke.MethodHandleInfo [class]
java.lang.management.LockInfo#from
java.lang.reflect.TypeVariable#getAnnotatedBounds
java.lang.reflect.Type#getTypeName
java.lang.reflect.Parameter [class]
java.lang.reflect.Modifier#parameterModifiers
java.lang.reflect.Method#isDefault
java.lang.reflect.Method#getAnnotatedReturnType
java.lang.reflect.MalformedParametersException [class]
java.lang.reflect.Field#getAnnotationsByType
java.lang.reflect.Field#getAnnotatedType
java.lang.reflect.Executable [class]
java.lang.reflect.Executable#getParameterCount
java.lang.reflect.Executable#getParameters
java.lang.reflect.Executable#getAnnotationsByType
java.lang.reflect.Executable#getAnnotatedReturnType
java.lang.reflect.Executable#getAnnotatedReceiverType
java.lang.reflect.Executable#getAnnotatedParameterTypes
java.lang.reflect.Executable#getAnnotatedExceptionTypes
java.lang.reflect.Constructor#getAnnotatedReturnType
java.lang.reflect.Constructor#getAnnotatedReceiverType
java.lang.reflect.AnnotatedWildcardType [class]
java.lang.reflect.AnnotatedTypeVariable [class]
java.lang.reflect.AnnotatedType [class]
java.lang.reflect.AnnotatedParameterizedType [class]
java.lang.reflect.AnnotatedElement#getAnnotationsByType
java.lang.reflect.AnnotatedElement#getDeclaredAnnotation
java.lang.reflect.AnnotatedElement#getDeclaredAnnotationsByType
java.lang.reflect.AnnotatedArrayType [class]
java.lang.reflect.AccessibleObject#getAnnotationsByType
java.lang.reflect.AccessibleObject#getDeclaredAnnotation
java.lang.reflect.AccessibleObject#getDeclaredAnnotationsByType
java.math.BigInteger#longValueExact
java.math.BigInteger#intValueExact
java.math.BigInteger#shortValueExact
java.math.BigInteger#byteValueExact
java.net.URLPermission [class]
java.nio.file.Files#newBufferedReader
java.nio.file.Files#newBufferedWriter
java.nio.file.Files#readAllLines
java.nio.file.Files#write
java.nio.file.Files#list
java.nio.file.Files#walk
java.nio.file.Files#walk
java.nio.file.Files#find
java.nio.file.Files#lines
java.nio.file.Files#lines
java.nio.file.attribute.FileTime#from
java.nio.file.attribute.FileTime#toInstant
java.security.SecureRandom#getInstanceStrong
java.security.Principal#implies
java.security.PKCS12Attribute [class]
java.security.KeyStore.PasswordProtection#getProtectionAlgorithm
java.security.KeyStore.PasswordProtection#getProtectionParameters
java.security.KeyStore.Entry#getAttributes
java.security.KeyStore.Entry.Attribute [class]
java.security.KeyStore.PrivateKeyEntry#getAttributes
java.security.KeyStore.SecretKeyEntry#getAttributes
java.security.KeyStore.TrustedCertificateEntry#getAttributes
java.security.DomainLoadStoreParameter [class]
java.security.AccessController#doPrivileged
java.security.AccessController#doPrivilegedWithCombiner
java.security.AccessController#doPrivileged
java.security.AccessController#doPrivilegedWithCombiner
java.security.cert.X509Certificate#verify
java.security.cert.X509CRL#verify
java.security.cert.PKIXRevocationChecker [class]
java.security.cert.Certificate#verify
java.security.cert.CertPathValidatorSpi#engineGetRevocationChecker
java.security.cert.CertPathValidator#getRevocationChecker
java.security.cert.CertPathChecker [class]
java.security.cert.CertPathBuilderSpi#engineGetRevocationChecker
java.security.cert.CertPathBuilder#getRevocationChecker
java.security.spec.DSAGenParameterSpec [class]
java.sql.Timestamp#valueOf
java.sql.Timestamp#toLocalDateTime
java.sql.Timestamp#from
java.sql.Timestamp#toInstant
java.sql.Time#valueOf
java.sql.Time#toLocalTime
java.sql.Statement#getLargeUpdateCount
java.sql.Statement#setLargeMaxRows
java.sql.Statement#getLargeMaxRows
java.sql.Statement#executeLargeBatch
java.sql.Statement#executeLargeUpdate
java.sql.Statement#executeLargeUpdate
java.sql.Statement#executeLargeUpdate
java.sql.Statement#executeLargeUpdate
java.sql.SQLType [class]
java.sql.SQLOutput#writeObject
java.sql.SQLInput#readObject
java.sql.ResultSet#updateObject
java.sql.ResultSet#updateObject
java.sql.ResultSet#updateObject
java.sql.ResultSet#updateObject
java.sql.PreparedStatement#setObject
java.sql.PreparedStatement#setObject
java.sql.PreparedStatement#executeLargeUpdate
java.sql.JDBCType [class]
java.sql.DriverAction [class]
java.sql.DriverAction#deregister
java.sql.Date#valueOf
java.sql.Date#toLocalDate
java.sql.DatabaseMetaData#getMaxLogicalLobSize
java.sql.DatabaseMetaData#supportsRefCursors
java.sql.CallableStatement#setObject
java.sql.CallableStatement#setObject
java.sql.CallableStatement#registerOutParameter
java.sql.CallableStatement#registerOutParameter
java.sql.CallableStatement#registerOutParameter
java.sql.CallableStatement#registerOutParameter
java.sql.CallableStatement#registerOutParameter
java.sql.CallableStatement#registerOutParameter
java.sql.BatchUpdateException#getLargeUpdateCounts
java.time.chrono.ThaiBuddhistEra [class]
java.time.chrono.ThaiBuddhistDate [class]
java.time.chrono.ThaiBuddhistChronology [class]
java.time.chrono.MinguoEra [class]
java.time.chrono.MinguoDate [class]
java.time.chrono.MinguoChronology [class]
java.time.chrono.JapaneseEra [class]
java.time.chrono.JapaneseDate [class]
java.time.chrono.JapaneseChronology [class]
java.time.chrono.IsoEra [class]
java.time.chrono.IsoChronology [class]
java.time.chrono.HijrahEra [class]
java.time.chrono.HijrahDate [class]
java.time.chrono.HijrahChronology [class]
java.time.chrono.Era [class]
java.time.chrono.Chronology [class]
java.time.chrono.ChronoZonedDateTime [class]
java.time.chrono.ChronoPeriod [class]
java.time.chrono.ChronoLocalDateTime [class]
java.time.chrono.ChronoLocalDate [class]
java.time.chrono.AbstractChronology [class]
java.time.ZonedDateTime [class]
java.time.ZoneOffset [class]
java.time.ZoneId [class]
java.time.YearMonth [class]
java.time.Year [class]
java.time.Period [class]
java.time.OffsetTime [class]
java.time.OffsetDateTime [class]
java.time.MonthDay [class]
java.time.Month [class]
java.time.LocalTime [class]
java.time.LocalDateTime [class]
java.time.LocalDate [class]
java.time.Instant [class]
java.time.Duration [class]
java.time.DayOfWeek [class]
java.time.DateTimeException [class]
java.time.Clock [class]
java.time.format.SignStyle [class]
java.time.format.ResolverStyle [class]
java.time.format.FormatStyle [class]
java.time.format.DecimalStyle [class]
java.time.format.DateTimeParseException [class]
java.time.format.DateTimeFormatterBuilder [class]
java.time.format.DateTimeFormatter [class]
java.time.temporal.WeekFields [class]
java.time.temporal.ValueRange [class]
java.time.temporal.UnsupportedTemporalTypeException [class]
java.time.temporal.TemporalUnit [class]
java.time.temporal.TemporalQuery [class]
java.time.temporal.TemporalQueries [class]
java.time.temporal.TemporalField [class]
java.time.temporal.TemporalAmount [class]
java.time.temporal.TemporalAdjusters [class]
java.time.temporal.TemporalAdjuster [class]
java.time.temporal.TemporalAccessor [class]
java.time.temporal.Temporal [class]
java.time.temporal.JulianFields [class]
java.time.temporal.IsoFields [class]
java.time.temporal.ChronoUnit [class]
java.time.temporal.ChronoField [class]
java.time.zone.ZoneRulesProvider [class]
java.time.zone.ZoneRulesException [class]
java.time.zone.ZoneRules [class]
java.time.zone.ZoneOffsetTransitionRule [class]
java.time.zone.ZoneOffsetTransition [class]
java.util.Vector#spliterator
java.util.TreeSet#spliterator
java.util.TimeZone#getTimeZone
java.util.TimeZone#toZoneId
java.util.StringJoiner [class]
java.util.SplittableRandom [class]
java.util.Spliterators [class]
java.util.Spliterators.AbstractSpliterator [class]
java.util.Spliterators.AbstractIntSpliterator [class]
java.util.Spliterators.AbstractLongSpliterator [class]
java.util.Spliterators.AbstractDoubleSpliterator [class]
java.util.Spliterator [class]
java.util.Spliterator.OfPrimitive [class]
java.util.Spliterator.OfInt [class]
java.util.Spliterator.OfLong [class]
java.util.Spliterator.OfDouble [class]
java.util.SortedSet#spliterator
java.util.Set#spliterator
java.util.ResourceBundle#getBaseBundleName
java.util.Random#ints
java.util.Random#ints
java.util.Random#ints
java.util.Random#ints
java.util.Random#longs
java.util.Random#longs
java.util.Random#longs
java.util.Random#longs
java.util.Random#doubles
java.util.Random#doubles
java.util.Random#doubles
java.util.Random#doubles
java.util.PriorityQueue#spliterator
java.util.PrimitiveIterator [class]
java.util.PrimitiveIterator.OfInt [class]
java.util.PrimitiveIterator.OfLong [class]
java.util.PrimitiveIterator.OfDouble [class]
java.util.OptionalLong [class]
java.util.OptionalInt [class]
java.util.OptionalDouble [class]
java.util.Optional [class]
java.util.Objects#isNull
java.util.Objects#nonNull
java.util.Objects#requireNonNull
java.util.Map#getOrDefault
java.util.Map#forEach
java.util.Map#replaceAll
java.util.Map#putIfAbsent
java.util.Map#remove
java.util.Map#replace
java.util.Map#replace
java.util.Map#computeIfAbsent
java.util.Map#computeIfPresent
java.util.Map#compute
java.util.Map#merge
java.util.Map.Entry#comparingByKey
java.util.Map.Entry#comparingByValue
java.util.Map.Entry#comparingByKey
java.util.Map.Entry#comparingByValue
java.util.LongSummaryStatistics [class]
java.util.Locale#hasExtensions
java.util.Locale#stripExtensions
java.util.Locale#filter
java.util.Locale#filter
java.util.Locale#filterTags
java.util.Locale#filterTags
java.util.Locale#lookup
java.util.Locale#lookupTag
java.util.Locale.FilteringMode [class]
java.util.Locale.LanguageRange [class]
java.util.List#replaceAll
java.util.List#sort
java.util.List#spliterator
java.util.LinkedList#spliterator
java.util.LinkedHashSet#spliterator
java.util.Iterator#forEachRemaining
java.util.IntSummaryStatistics [class]
java.util.HashSet#spliterator
java.util.GregorianCalendar#getCalendarType
java.util.GregorianCalendar#toZonedDateTime
java.util.GregorianCalendar#from
java.util.DoubleSummaryStatistics [class]
java.util.Date#from
java.util.Date#toInstant
java.util.Comparator#reversed
java.util.Comparator#thenComparing
java.util.Comparator#thenComparing
java.util.Comparator#thenComparing
java.util.Comparator#thenComparingInt
java.util.Comparator#thenComparingLong
java.util.Comparator#thenComparingDouble
java.util.Comparator#reverseOrder
java.util.Comparator#naturalOrder
java.util.Comparator#nullsFirst
java.util.Comparator#nullsLast
java.util.Comparator#comparing
java.util.Comparator#comparing
java.util.Comparator#comparingInt
java.util.Comparator#comparingLong
java.util.Comparator#comparingDouble
java.util.Collections#unmodifiableNavigableSet
java.util.Collections#unmodifiableNavigableMap
java.util.Collections#synchronizedNavigableSet
java.util.Collections#synchronizedNavigableMap
java.util.Collections#checkedQueue
java.util.Collections#checkedNavigableSet
java.util.Collections#checkedNavigableMap
java.util.Collections#emptySortedSet
java.util.Collections#emptyNavigableSet
java.util.Collections#emptySortedMap
java.util.Collections#emptyNavigableMap
java.util.Collection#removeIf
java.util.Collection#spliterator
java.util.Collection#stream
java.util.Collection#parallelStream
java.util.Calendar#getAvailableCalendarTypes
java.util.Calendar#getCalendarType
java.util.Calendar#toInstant
java.util.Calendar.Builder [class]
java.util.BitSet#stream
java.util.Base64 [class]
java.util.Base64.Encoder [class]
java.util.Base64.Decoder [class]
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelSort
java.util.Arrays#parallelPrefix
java.util.Arrays#parallelPrefix
java.util.Arrays#parallelPrefix
java.util.Arrays#parallelPrefix
java.util.Arrays#parallelPrefix
java.util.Arrays#parallelPrefix
java.util.Arrays#parallelPrefix
java.util.Arrays#parallelPrefix
java.util.Arrays#setAll
java.util.Arrays#parallelSetAll
java.util.Arrays#setAll
java.util.Arrays#parallelSetAll
java.util.Arrays#setAll
java.util.Arrays#parallelSetAll
java.util.Arrays#setAll
java.util.Arrays#parallelSetAll
java.util.Arrays#spliterator
java.util.Arrays#spliterator
java.util.Arrays#spliterator
java.util.Arrays#spliterator
java.util.Arrays#spliterator
java.util.Arrays#spliterator
java.util.Arrays#spliterator
java.util.Arrays#spliterator
java.util.Arrays#stream
java.util.Arrays#stream
java.util.Arrays#stream
java.util.Arrays#stream
java.util.Arrays#stream
java.util.Arrays#stream
java.util.Arrays#stream
java.util.Arrays#stream
java.util.ArrayList#spliterator
java.util.ArrayDeque#spliterator
java.util.concurrent.ThreadLocalRandom#ints
java.util.concurrent.ThreadLocalRandom#ints
java.util.concurrent.ThreadLocalRandom#ints
java.util.concurrent.ThreadLocalRandom#ints
java.util.concurrent.ThreadLocalRandom#longs
java.util.concurrent.ThreadLocalRandom#longs
java.util.concurrent.ThreadLocalRandom#longs
java.util.concurrent.ThreadLocalRandom#longs
java.util.concurrent.ThreadLocalRandom#doubles
java.util.concurrent.ThreadLocalRandom#doubles
java.util.concurrent.ThreadLocalRandom#doubles
java.util.concurrent.ThreadLocalRandom#doubles
java.util.concurrent.SynchronousQueue#spliterator
java.util.concurrent.PriorityBlockingQueue#spliterator
java.util.concurrent.LinkedTransferQueue#spliterator
java.util.concurrent.LinkedBlockingQueue#spliterator
java.util.concurrent.LinkedBlockingDeque#spliterator
java.util.concurrent.ForkJoinTask#quietlyComplete
java.util.concurrent.ForkJoinTask#getForkJoinTaskTag
java.util.concurrent.ForkJoinTask#setForkJoinTaskTag
java.util.concurrent.ForkJoinTask#compareAndSetForkJoinTaskTag
java.util.concurrent.ForkJoinPool#commonPool
java.util.concurrent.ForkJoinPool#getCommonPoolParallelism
java.util.concurrent.Executors#newWorkStealingPool
java.util.concurrent.Executors#newWorkStealingPool
java.util.concurrent.CountedCompleter [class]
java.util.concurrent.CopyOnWriteArraySet#spliterator
java.util.concurrent.CopyOnWriteArrayList#spliterator
java.util.concurrent.ConcurrentSkipListSet#spliterator
java.util.concurrent.ConcurrentSkipListMap#getOrDefault
java.util.concurrent.ConcurrentSkipListMap#computeIfAbsent
java.util.concurrent.ConcurrentSkipListMap#computeIfPresent
java.util.concurrent.ConcurrentSkipListMap#compute
java.util.concurrent.ConcurrentSkipListMap#merge
java.util.concurrent.ConcurrentMap#getOrDefault
java.util.concurrent.ConcurrentMap#forEach
java.util.concurrent.ConcurrentMap#replaceAll
java.util.concurrent.ConcurrentMap#computeIfAbsent
java.util.concurrent.ConcurrentMap#computeIfPresent
java.util.concurrent.ConcurrentMap#compute
java.util.concurrent.ConcurrentMap#merge
java.util.concurrent.ConcurrentLinkedQueue#spliterator
java.util.concurrent.ConcurrentLinkedDeque#spliterator
java.util.concurrent.ConcurrentHashMap#mappingCount
java.util.concurrent.ConcurrentHashMap#newKeySet
java.util.concurrent.ConcurrentHashMap#newKeySet
java.util.concurrent.ConcurrentHashMap#forEach
java.util.concurrent.ConcurrentHashMap#forEach
java.util.concurrent.ConcurrentHashMap#search
java.util.concurrent.ConcurrentHashMap#reduce
java.util.concurrent.ConcurrentHashMap#reduceToDouble
java.util.concurrent.ConcurrentHashMap#reduceToLong
java.util.concurrent.ConcurrentHashMap#reduceToInt
java.util.concurrent.ConcurrentHashMap#forEachKey
java.util.concurrent.ConcurrentHashMap#forEachKey
java.util.concurrent.ConcurrentHashMap#searchKeys
java.util.concurrent.ConcurrentHashMap#reduceKeys
java.util.concurrent.ConcurrentHashMap#reduceKeys
java.util.concurrent.ConcurrentHashMap#reduceKeysToDouble
java.util.concurrent.ConcurrentHashMap#reduceKeysToLong
java.util.concurrent.ConcurrentHashMap#reduceKeysToInt
java.util.concurrent.ConcurrentHashMap#forEachValue
java.util.concurrent.ConcurrentHashMap#forEachValue
java.util.concurrent.ConcurrentHashMap#searchValues
java.util.concurrent.ConcurrentHashMap#reduceValues
java.util.concurrent.ConcurrentHashMap#reduceValues
java.util.concurrent.ConcurrentHashMap#reduceValuesToDouble
java.util.concurrent.ConcurrentHashMap#reduceValuesToLong
java.util.concurrent.ConcurrentHashMap#reduceValuesToInt
java.util.concurrent.ConcurrentHashMap#forEachEntry
java.util.concurrent.ConcurrentHashMap#forEachEntry
java.util.concurrent.ConcurrentHashMap#searchEntries
java.util.concurrent.ConcurrentHashMap#reduceEntries
java.util.concurrent.ConcurrentHashMap#reduceEntries
java.util.concurrent.ConcurrentHashMap#reduceEntriesToDouble
java.util.concurrent.ConcurrentHashMap#reduceEntriesToLong
java.util.concurrent.ConcurrentHashMap#reduceEntriesToInt
java.util.concurrent.ConcurrentHashMap.KeySetView [class]
java.util.concurrent.CompletionStage [class]
java.util.concurrent.CompletionException [class]
java.util.concurrent.CompletableFuture [class]
java.util.concurrent.CompletableFuture.AsynchronousCompletionTask [class]
java.util.concurrent.ArrayBlockingQueue#spliterator
java.util.concurrent.atomic.LongAdder [class]
java.util.concurrent.atomic.LongAccumulator [class]
java.util.concurrent.atomic.DoubleAdder [class]
java.util.concurrent.atomic.DoubleAccumulator [class]
java.util.concurrent.atomic.AtomicReferenceFieldUpdater#getAndUpdate
java.util.concurrent.atomic.AtomicReferenceFieldUpdater#updateAndGet
java.util.concurrent.atomic.AtomicReferenceFieldUpdater#getAndAccumulate
java.util.concurrent.atomic.AtomicReferenceFieldUpdater#accumulateAndGet
java.util.concurrent.atomic.AtomicReferenceArray#getAndUpdate
java.util.concurrent.atomic.AtomicReferenceArray#updateAndGet
java.util.concurrent.atomic.AtomicReferenceArray#getAndAccumulate
java.util.concurrent.atomic.AtomicReferenceArray#accumulateAndGet
java.util.concurrent.atomic.AtomicReference#getAndUpdate
java.util.concurrent.atomic.AtomicReference#updateAndGet
java.util.concurrent.atomic.AtomicReference#getAndAccumulate
java.util.concurrent.atomic.AtomicReference#accumulateAndGet
java.util.concurrent.atomic.AtomicLongFieldUpdater#getAndUpdate
java.util.concurrent.atomic.AtomicLongFieldUpdater#updateAndGet
java.util.concurrent.atomic.AtomicLongFieldUpdater#getAndAccumulate
java.util.concurrent.atomic.AtomicLongFieldUpdater#accumulateAndGet
java.util.concurrent.atomic.AtomicLongArray#getAndUpdate
java.util.concurrent.atomic.AtomicLongArray#updateAndGet
java.util.concurrent.atomic.AtomicLongArray#getAndAccumulate
java.util.concurrent.atomic.AtomicLongArray#accumulateAndGet
java.util.concurrent.atomic.AtomicLong#getAndUpdate
java.util.concurrent.atomic.AtomicLong#updateAndGet
java.util.concurrent.atomic.AtomicLong#getAndAccumulate
java.util.concurrent.atomic.AtomicLong#accumulateAndGet
java.util.concurrent.atomic.AtomicIntegerFieldUpdater#getAndUpdate
java.util.concurrent.atomic.AtomicIntegerFieldUpdater#updateAndGet
java.util.concurrent.atomic.AtomicIntegerFieldUpdater#getAndAccumulate
java.util.concurrent.atomic.AtomicIntegerFieldUpdater#accumulateAndGet
java.util.concurrent.atomic.AtomicIntegerArray#getAndUpdate
java.util.concurrent.atomic.AtomicIntegerArray#updateAndGet
java.util.concurrent.atomic.AtomicIntegerArray#getAndAccumulate
java.util.concurrent.atomic.AtomicIntegerArray#accumulateAndGet
java.util.concurrent.atomic.AtomicInteger#getAndUpdate
java.util.concurrent.atomic.AtomicInteger#updateAndGet
java.util.concurrent.atomic.AtomicInteger#getAndAccumulate
java.util.concurrent.atomic.AtomicInteger#accumulateAndGet
java.util.concurrent.locks.StampedLock [class]
java.util.function.UnaryOperator [class]
java.util.function.ToLongFunction [class]
java.util.function.ToLongBiFunction [class]
java.util.function.ToIntFunction [class]
java.util.function.ToIntBiFunction [class]
java.util.function.ToDoubleFunction [class]
java.util.function.ToDoubleBiFunction [class]
java.util.function.Supplier [class]
java.util.function.Predicate [class]
java.util.function.ObjLongConsumer [class]
java.util.function.ObjIntConsumer [class]
java.util.function.ObjDoubleConsumer [class]
java.util.function.LongUnaryOperator [class]
java.util.function.LongToIntFunction [class]
java.util.function.LongToDoubleFunction [class]
java.util.function.LongSupplier [class]
java.util.function.LongPredicate [class]
java.util.function.LongFunction [class]
java.util.function.LongConsumer [class]
java.util.function.LongBinaryOperator [class]
java.util.function.IntUnaryOperator [class]
java.util.function.IntToLongFunction [class]
java.util.function.IntToDoubleFunction [class]
java.util.function.IntSupplier [class]
java.util.function.IntPredicate [class]
java.util.function.IntFunction [class]
java.util.function.IntConsumer [class]
java.util.function.IntBinaryOperator [class]
java.util.function.Function [class]
java.util.function.DoubleUnaryOperator [class]
java.util.function.DoubleToLongFunction [class]
java.util.function.DoubleToIntFunction [class]
java.util.function.DoubleSupplier [class]
java.util.function.DoublePredicate [class]
java.util.function.DoubleFunction [class]
java.util.function.DoubleConsumer [class]
java.util.function.DoubleBinaryOperator [class]
java.util.function.Consumer [class]
java.util.function.BooleanSupplier [class]
java.util.function.BinaryOperator [class]
java.util.function.BiPredicate [class]
java.util.function.BiFunction [class]
java.util.function.BiConsumer [class]
java.util.logging.Logger#log
java.util.logging.Logger#logp
java.util.logging.Logger#logp
java.util.logging.Logger#logrb
java.util.logging.Logger#logrb
java.util.logging.Logger#severe
java.util.logging.Logger#warning
java.util.logging.Logger#info
java.util.logging.Logger#config
java.util.logging.Logger#fine
java.util.logging.Logger#finer
java.util.logging.Logger#finest
java.util.logging.Logger#setResourceBundle
java.util.regex.Pattern#asPredicate
java.util.regex.Pattern#splitAsStream
java.util.regex.Matcher#start
java.util.regex.Matcher#end
java.util.spi.TimeZoneNameProvider#getGenericDisplayName
java.util.spi.ResourceBundleControlProvider [class]
java.util.spi.LocaleServiceProvider#isSupportedLocale
java.util.spi.CalendarNameProvider [class]
java.util.spi.CalendarDataProvider [class]
java.util.stream.StreamSupport [class]
java.util.stream.Stream [class]
java.util.stream.Stream.Builder [class]
java.util.stream.LongStream [class]
java.util.stream.LongStream.Builder [class]
java.util.stream.IntStream [class]
java.util.stream.IntStream.Builder [class]
java.util.stream.DoubleStream [class]
java.util.stream.DoubleStream.Builder [class]
java.util.stream.Collectors [class]
java.util.stream.Collector [class]
java.util.stream.BaseStream [class]
java.util.zip.ZipFile#stream
java.util.zip.ZipEntry#setLastModifiedTime
java.util.zip.ZipEntry#getLastModifiedTime
java.util.zip.ZipEntry#setLastAccessTime
java.util.zip.ZipEntry#getLastAccessTime
java.util.zip.ZipEntry#setCreationTime
java.util.zip.ZipEntry#getCreationTime
java.util.zip.CRC32#update
java.util.zip.Adler32#update
javax.lang.model.AnnotatedConstruct [class]
javax.lang.model.element.ExecutableElement#getReceiverType
javax.lang.model.element.ExecutableElement#isDefault
javax.lang.model.type.TypeVisitor#visitIntersection
javax.lang.model.type.IntersectionType [class]
javax.lang.model.type.ExecutableType#getReceiverType
javax.lang.model.util.TypeKindVisitor8 [class]
javax.lang.model.util.SimpleTypeVisitor8 [class]
javax.lang.model.util.SimpleElementVisitor8 [class]
javax.lang.model.util.SimpleAnnotationValueVisitor8 [class]
javax.lang.model.util.Elements#isFunctionalInterface
javax.lang.model.util.ElementScanner8 [class]
javax.lang.model.util.ElementKindVisitor8 [class]
javax.lang.model.util.AbstractTypeVisitor8 [class]
javax.lang.model.util.AbstractTypeVisitor6#visitIntersection
javax.lang.model.util.AbstractElementVisitor8 [class]
javax.lang.model.util.AbstractAnnotationValueVisitor8 [class]
javax.security.auth.kerberos.KeyTab#getUnboundInstance
javax.security.auth.kerberos.KeyTab#getInstance
javax.security.auth.kerberos.KeyTab#getUnboundInstance
javax.security.auth.kerberos.KeyTab#getInstance
javax.security.auth.kerberos.KeyTab#getPrincipal
javax.security.auth.kerberos.KeyTab#isBound
javax.xml.validation.SchemaFactoryConfigurationError [class]

目に付く新クラス・メソッドをいくつか調べてみます

時間の許す限り、気になったクラス、メソッドを調べていきます。なお、Stream APIやDate and Time APIは割愛しています。

java.io.UncheckedIOException

IOExceptionをラップして非チェック例外とするものです。

java.lang.String#join

複数の文字列をデリミターで結合するメソッドです。
for文で回してprintするときに最後の文字列にもカンマが付いてやだなぁと思ったときにこれを使うと一発です。

for (TankEngine t : tankEngines) {
    System.out.print(t + ", ");
}
System.out.println("");

とやって、Thomas, Edward, Henry, Gordon, James, Percy,
となってしまったものが

System.out.println(String.join(", ", tankEngines));

と記述できるようになります。

java.lang.Short#toUnsignedInt

本来short型(とそのラッパークラスのShort型)は符号付き16bit整数を保持しますが、バイナリデータ等から16bit符号なし整数のビットパターンをshort型に詰めてしまった場合、このshort型をint型へワイドニング変換すると意味的に違う値になってしまいます。(65535が-1になってしまう)

int v1 = orig & 0xffff;
int v2 = Short.toUnsignedInt(orig)

とビットマスクをしていたコードがメソッドになった位ですが。

java.lang.Process#waitFor

タイムアウト指定可能なwairForメソッドが追加されました。

java.lang.Process#isAlive

サブプロセスが生きているかを検査するメソッドが追加されました。

java.lang.Math#addExact

引数2つを加算し、結果を返却しますが、オーバーフローが発生した場合は例外ArithmeticExceptionをスローします。
同様に、subtractExact、multiplyExact、incrementExact、decrementExact、negateExactが追加されています。

java.lang.Class#toGenericString

型修飾子、型の種類、型名を文字列化するようです。

java.nio.file.Files#...

Streamを返すlines、Streamを返すlist、find、walkなどのメソッドが追加されています。

java.sql.Statement#...

executeLargeBatch、executeLargeUpdate、などが追加されています。

java.util.StringJoiner

デリミタとプレフィックス、ポストフィックス文字列を指定して結合するクラスです。

java.util.concurrent.locks.StampedLock

writeLock、readLock、tryOptimisticReadの3つのモードを持つロックです。

java.util.logging.Logger#log
void log(Level level, Throwable thrown, Supplier<String> msgSupplier);

が追加されています。log以外にもinfo, fine, finer, finest, warning, severなどに追加されています。