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文書差分情報が付属文書として提供されています。
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を示す記載パターンを特定します。
この手の作業は、シェルスクリプトとgrep、sedなどで組むと簡単なので、以下に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#isAlive
サブプロセスが生きているかを検査するメソッドが追加されました。
java.lang.Math#addExact
引数2つを加算し、結果を返却しますが、オーバーフローが発生した場合は例外ArithmeticExceptionをスローします。
同様に、subtractExact、multiplyExact、incrementExact、decrementExact、negateExactが追加されています。
java.lang.Class#toGenericString
型修飾子、型の種類、型名を文字列化するようです。
java.nio.file.Files#...
Stream
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などに追加されています。