LoginSignup
33
31

More than 5 years have passed since last update.

Java9で追加されたメソッド一覧とその使い方

Last updated at Posted at 2016-07-29

OracleのJDK9-eaのJavaDoc を参照して since:9 の表記があるクラスの一部について記載しています。
JDK9は未リリースであり、実際のリリースではこの記事とは異なる可能性があります。

Package java.lang

Integer の章

parseInt

public static int parseInt(CharSequence s,
                           int beginIndex,
                           int endIndex,
                           int radix)
                    throws NumberFormatException

文字列の一部を切り取ってIntegerにパースするメソッド

Java8

// 16進数で表記したカラーコード
String cssColor = "#4dba16";
int red   = Integer.parseInt(cssColor.substring(1, 3), 16);
int green = Integer.parseInt(cssColor.substring(3, 5), 16);
int blue  = Integer.parseInt(cssColor.substring(5, 7), 16);

// 何かのお金
String payStr = "2000メタ";
int pay = Integer.parseInt(payStr.substring(0, payStr.length() - 2), 10);

Java9

String cssColor = "#4dba16";
int red   = Integer.parseInt(cssColor, 1, 3, 16);
int green = Integer.parseInt(cssColor, 3, 5, 16);
int blue  = Integer.parseInt(cssColor, 5, 7, 16);

String payStr = "2000メタ";
int pay = Integer.parseInt(payStr, 0, payStr.length() - 2, 10);

parseUnsignedInt

public static int parseUnsignedInt(CharSequence s,
                                   int beginIndex,
                                   int endIndex,
                                   int radix)
                            throws NumberFormatException

文字列の一部を切り取って符号なしでIntegerにパースするメソッド

Java8

// Integer.MAX_VALUE is 2147483647
String maxPlusOne    = "2147483648はIntegerの最大値を超えている";
// 次の行は NumberFormatException が発生する
int parseInt         = Integer.parseInt(maxPlusOne.substring(0, 10));
// 次の変数には -2147483648 が入る
int parseUnsignedInt = Integer.parseUnsignedInt(maxPlusOne.substring(0, 10));

Java9

// Integer.MAX_VALUE is 2147483647
String maxPlusOne    = "2147483648はIntegerの最大値を超えている";
// 次の行は NumberFormatException が発生する
int parseInt         = Integer.parseInt(maxPlusOne, 0, 10, 10);
// 次の変数には -2147483648 が入る
int parseUnsignedInt = Integer.parseUnsignedInt(maxPlusOne, 0, 10, 10);

Long の章

parseLong

public static long parseLong(CharSequence s,
                             int beginIndex,
                             int endIndex,
                             int radix)
                      throws NumberFormatException

文字列の一部を切り取ってLongにパースするメソッド

Java8 & Java9

Integerと同様なので省略

parseUnsignedLong

public static long parseUnsignedLong(CharSequence s,
                                     int beginIndex,
                                     int endIndex,
                                     int radix)
                              throws NumberFormatException

文字列の一部を切り取って符号なしでLongにパースするメソッド

Java8 & Java9

Integerと同様なので省略

Byte の章

compareUnsigned

public static int compareUnsigned(byte x,
                                  byte y)

Java8

// TODO:後で書く

Java9

// TODO:後で書く

Character の章

定数

追加された以下の4つの定数は Unicode 6.3 で新たに追加されたものらしいですが、
アラビア語やヘブライ語などを使う機会がなければ気にする必要はないようです

定数 Code Point 略記
DIRECTIONALITY_LEFT_TO_RIGHT_ISOLATE U+2066 LRI
DIRECTIONALITY_RIGHT_TO_LEFT_ISOLATE U+2067 RLI
DIRECTIONALITY_FIRST_STRONG_ISOLATE U+2068 FSI
DIRECTIONALITY_POP_DIRECTIONAL_ISOLATE U+2069 PDI

codePointOf

public static int codePointOf(String name)

Java8

// TODO:後で書く

Java9

// TODO:後で書く

Character.UnicodeBlock の章

定数

たくさん

String の章

1.8時点では以下の2つのメソッドは親クラス(CharSequence)のデフォルト実装でした。
9からはおそらくこれ→ [JEP 254: Compact Strings] の影響で各クラスでOverrideする形に変わったと推測。
そのため使い方に変化はありません。

chars

public IntStream chars()

単純に文字コード値のストリームを生成する

Java8 & Java9

String characters = "defABC";
characters.chars()
        .mapToObj(c -> String.valueOf(Character.toChars(c)) + " is " + c)
        .sorted()
        .forEach(System.out::println);

codePoints

public IntStream codePoints()

サロゲートペアを考慮した文字コード値のストリームを生成する

Java8 & Java9

String characters = "𠮷野家の新メニュー 𩸽の開き定食 780円(嘘)";
characters.codePoints()
        .mapToObj(c -> String.valueOf(Character.toChars(c)))
        .filter(s -> s.length() > 1)
        .forEach(s -> System.out.println(s + " はサロゲートペア"));

StringBuffer の章

chars

Stringと同様なので省略

codePoints

Stringと同様なので省略

StringBuilder の章

chars

Stringと同様なので省略

codePoints

Stringと同様なので省略

Class<T> の章

forName

public static Class<?> forName(Module module,
                               String name)

Java9

// TODO:後で書く

getModule

public Module getModule()

Java9で新たに追加されたModuleクラスを取得するメソッド

Java9

// TODO:後で書く

getPackageName

public String getPackageName()

完全修飾パッケージ名を取得できます

Java8

String packageName = String.class.getPackage().getName();

Java9

String packageName = String.class.getPackageName();

ClassLoader の章

findClass

protected Class<?> findClass(String moduleName,
                             String name)

findResource

getUnnamedModule

getPlatformClassLoader

getDefinedPackage

getDefinedPackages

StrictMath の章

multiplyExact

multiplyFull

multiplyHigh

floorDiv

floorMod

Package java.math

BigInteger の章

定数

BigInteger.TWO

0,1,10は前からあったが2が追加された

BigInteger

public BigInteger(byte[] val,
                  int off,
                  int len)

sqrt

public BigInteger sqrt()

平方根を求めるメソッドが追加された

Java8

※処理はここを参考に作成しました

BigInteger number = BigInteger.valueOf(227529L);
BigInteger a = BigInteger.ONE;
BigInteger b = number.shiftRight(5).add(BigInteger.valueOf(8));
while (b.compareTo(a) >= 0) {
    BigInteger mid = a.add(b).shiftRight(1);
    if (mid.multiply(mid).compareTo(n) > 0) {
        b = mid.subtract(BigInteger.ONE);
    } else {
        a = mid.add(BigInteger.ONE);
    }
}
BigInteger sqrtNumber = a.subtract(BigInteger.ONE);

Java9

BigInteger number = BigInteger.valueOf(227529L);
BigInteger sqrtNumber = number.sqrt();

sqrtAndRemainder

public BigInteger sqrtAndRemainder()

平方根とその余りを求めるメソッドが追加された

Java8

BigInteger number = BigInteger.valueOf(228483L);
BigInteger a = BigInteger.ONE;
BigInteger b = number.shiftRight(5).add(BigInteger.valueOf(8));
while (b.compareTo(a) >= 0) {
    BigInteger mid = a.add(b).shiftRight(1);
    if (mid.multiply(mid).compareTo(n) > 0) {
        b = mid.subtract(BigInteger.ONE);
    } else {
        a = mid.add(BigInteger.ONE);
    }
}
BigInteger sqrtNumber = a.subtract(BigInteger.ONE);
BigInteger remainderNumber = number.subtract(sqrtNumber.multiply(sqrtNumber));

Java9

BigInteger number = BigInteger.valueOf(228483L);
BigInteger[] sqrtAndRemainderNumber = number.sqrtAndRemainder();
BigInteger sqrtNumber = sqrtAndRemainderNumber[0];
BigInteger remainderNumber = sqrtAndRemainderNumber[1];

BigDecimal の章

定数

BigInteger.TWO は追加されたが BigDecimal.TWO は追加されてない。

丸めモードの定数が非推奨になった

以下の定数全てが@Deprecated(since=“9”)となった。

丸めモード 説明
ROUND_CEILING の無限大へ近づける
ROUND_FLOOR の無限大へ近づける
ROUND_HALF_DOWN 五捨六入
ROUND_HALF_UP 四捨五入
ROUND_DOWN 切り捨て
ROUND_UP 切り上げ
ROUND_HALF_EVEN 末尾を偶数にする
ROUND_UNNECESSARY 丸めない

上記に伴い上記を使用するdivideやsetScaleも非推奨となってます
(丸めモードのEnumは1.5から存在するのだから早く削除すればいいのに……)

sqrt

public BigDecimal sqrt(MathContext mc)

平方根を求めるメソッドが追加された

Java8

※元の処理はここを参考に作成しました

BigDecimal number = new BigDecimal(2);
int scale = 34;

BigDecimal a = new BigDecimal(Math.sqrt(number.doubleValue()), MathContext.DECIMAL128);
BigDecimal b = new BigDecimal(2);
for(int tempScale = 16; tempScale < scale; tempScale *= 2) {
    a = x.subtract(
            a.multiply(a).subtract(number).divide(
            a.multiply(b), scale, RoundingMode.HALF_EVEN));
}
sqrtNumber = a;

Java9

BigDecimal number = new BigDecimal(2);
BigDecimal sqrtNumber = number.sqrt();

Package java.time

Java8で追加されため、まだ浸透していない感じのするパッケージ
ところどころ Joda-Time に似てる?

Clock の章

tickMillis

public static Clock tickMillis(ZoneId zone)

1分ごとに変わる時計 tickMinutes(ZoneId zone) や
1秒ごとに変わる時計 tickSeconds(ZoneId zone) は以前から存在したが、
1ミリ秒ごとに変わる時計を作るメソッドが新たに追加された。

Java8

Clock baseClock = Clock.system(ZoneId.of("Asia/Tokyo"));
Clock millisClock = Clock.tick(baseClock, Duration.ofMillis(1));

Java9

Clock millisClock = Clock.tickMillis(ZoneId.of("Asia/Tokyo"));

Duration の章

dividedBy

toSeconds

toDaysPart

toHoursPart

toMinutesPart

toSecondsPart

toMillisPart

toNanosPart

LocalDate の章

ofInstant

datesUntil

datesUntil

toEpochSecond

LocalTime の章

ofInstant

toEpochSecond

OffsetTime の章

toEpochSecond

Package java.util

Optional<T> の章

ifPresentOrElse

public void ifPresentOrElse(Consumer<? super T> action,
                            Runnable emptyAction)

isPresent()のTrue,False両方で処理を行いたい場合に便利になりました
Java8でこのメソッドのようなことをしようと試行錯誤している記事で下記を見つけました。
で、結局 Optional のインスタンスに対して ifNotPresent 的なことをやりたいときはどうしたらいいんですか? by @mdstoy さん

Java8

public void hoge(Optional<String> optStr) {
    if (optStr.isPresent()) {
        Log.debug("Data is " + optStr.get());
    } else {
        Log.error("error");
    }
}

Java9

public void hoge(Optional<String> optStr) {
    optStr.ifPresentOrElse(
            s  -> Log.debug("Data is " + s),
            () -> Log.error("error"));
}

stream

public Stream<T> stream()

Optionalで包まれているコレクションからnullでないものだけを簡単に取り出せるようになった

Java8

List<Optional<String>> list = new ArrayList<>();
list.add(Optional.of("文字もじ"));
list.add(Optional.empty());

List<String> nonNullList = list.stream()
        .filter(s -> s.isPresent())
        .map(s -> s.get())
        .collect(Collectors.toList());

Java9

List<Optional<String>> list = new ArrayList<>();
list.add(Optional.of("文字もじ"));
list.add(Optional.empty());

List<String> nonNullList = list.stream()
        .flatMap(Optional::stream)
        .collect(Collectors.toList());

or

public Optional<T> or(Supplier<Optional<T>> supplier)

Optionalから取り出さずに処理を続けたい場合の処理が楽に書けるようになった

Java8

Optional<String> base = Optional.of(null);
Optional optStr;
if (base.isPresent()) {
    optStr = base;
} else {
    optStr = Optional.of("Empty");
}

Java9

Optional<String> base = Optional.of(null);
Optional optStr = base.or(() -> Optional.of("Empty"));

Arrays の章

equals

Java8

// TODO:後で書く

Java9

// TODO:後で書く

mismatch

Java8

// TODO:後で書く

Java9

// TODO:後で書く

List<E> の章

of

static <E> List<E> of()
static <E> List<E> of(E e1)
static <E> List<E> of(E e1, E e2)
...
static <E> List<E> of(E e1, E e2, E e4, E e5, E e6, E e7, E e8, E e9)
static <E> List<E> of(E e1, E e2, E e4, E e5, E e6, E e7, E e8, E e9, E e10)
static <E> List<E> of(E... elements)

イミュータブルなリストが簡単に作れる
このメソッド既視感が・・・・・・ そうだGuavaだ!

Java8

// TODO:Listのelementのネタを考える
public static final List<String> HOGE_LIST = Collections.unmodifiableList(
        new ArrayList<String>() {
            {
                add("hoge");
                add("fuga");
                add("piyo");
            }
        }
);

Java9

// TODO:Listのelementのネタを考える
public static final List<String> HERO_COLOR = List.of("hoge", "fuga", "piyo");

Set<E> の章

of

static <E> Set<E> of()
static <E> Set<E> of(E e1)
static <E> Set<E> of(E e1, E e2)
...
static <E> Set<E> of(E e1, E e2, E e4, E e5, E e6, E e7, E e8, E e9)
static <E> Set<E> of(E e1, E e2, E e4, E e5, E e6, E e7, E e8, E e9, E e10)
static <E> Set<E> of(E... elements)

イミュータブルなセットが簡単に作れる

Java8

public static final Set<String> HERO_COLOR = Collections.unmodifiableSet(
        new HashSet<String>() {
            {
                add("RED");
                add("BLUE");
                add("GREEN");
                add("YELLOW");
                add("PINK");
            }
        }
);

Java9

public static final Set<String> HERO_COLOR = Set.of("RED", "BLUE", "GREEN", "YELLOW", "PINK");

Map<K,V> の章

of

static <K,V> Map<K,V> of()
static <K,V> Map<K,V> of(K k1, V v1)
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2)
...
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5,  V v5,
                         K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9)
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5,  V v5,
                         K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10)

イミュータブルなマップが簡単に作れる

Java8

// TODO:Key-Valueのネタを考える
public static final List<String> HERO_COLOR = 
public static final Map<Integer, String> HOGE_MAP = Collections.unmodifiableMap(
    new HashMap<Integer, String>() {
        {
            put(0, "hoge");
            put(1, "fuga");
            put(2, "piyo");
        }
    }
);

Java9

// TODO:Key-Valueのネタを考える
Map<Integer, String> map = Map.of(
        0, "hoge",
        1, "fuga",
        2, "piyo"
);

ofEntries

static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

Java8

// TODO:後で書く

Java9

// TODO:後で書く

entry

static <K,V> Map.Entry<K,V> entry(K k,
                                  V v)

Java8

Map.Entry<String, Integer> entry = new TreeMap<String, Integer>() {
    {
        put("A", 1000);
    }
}.firstEntry();

Java9

Map.Entry<String, Integer> entry = Map.entry("A", 1000);

Objects の章

requireNonNullElse

requireNonNullElseGet

requireNonNull

checkIndex

checkFromToIndex

checkFromIndexSize

Enumeration の章

asIterator

Package java.util.jar

JarFile の章

JarFile

getVersion

isMultiRelease

Package java.util.stream

Stream<T> の章

以下の3つのメソッドについての投稿はすでにQiitaで投稿があったので詳しくは下記を参照ください。
Java 9 Streamに追加された3つの新機能 by @k--katoさん

takeWhile

default Stream<T> takeWhile(Predicate<? super T> predicate)

先頭から指定された条件に一致している間のストリームを取得できるメソッド

Java8

// TODO:動かないので後で直す
List<String> list = Arrays.asList("ね", "こ", "か", "い", "た", "い", "ね");

boolean isTakeWhile = true;
for (int str : list) {
    isTakeWhile = isTakeWhile && !str.equals("か");
    if (isTakeWhile) {
        System.out.print(str);
    }
}

Java9

List<String> list = Arrays.asList("ね", "こ", "か", "い", "た", "い", "ね");
list.stream()
        .takeWhile(s -> !s.equals("か"))
        .forEach(System.out::print);

dropWhile

default Stream<T> dropWhile(Predicate<? super T> predicate)

先頭から指定された条件に一致している間のストリームを取り除いたストリームを取得できるメソッド

Java8

List<String> list = Arrays.asList("ね", "こ", "か", "い", "た", "い", "ね");

boolean isDropWhile = true;
for (String str : list) {
    isDropWhile = isDropWhile && !s.equals("か");
    if (!isDropWhile) {
        System.out.print(str);
    }
}

Java9

List<String> list = Arrays.asList("ね", "こ", "か", "い", "た", "い", "ね");
list.stream()
        .dropWhile(s -> !s.equals("か"))
        .forEach(System.out::print);

ofNullable

static <T> Stream<T> ofNullable(T t)

Java8

// TODO:後で書く

Java9

// TODO:後で書く

Collectors の章

flatMapping

static <T,U,A,R> Collector<T,?,R> flatMapping(Function<? super T,? extends Stream<? extends U>> mapper,
                                              Collector<? super U,A,R> downstream)

Java8

// TODO:後で書く

Java9

// TODO:後で書く

filtering

static <T,A,R> Collector<T,?,R> filtering(Predicate<? super T> predicate,
                                          Collector<? super T,A,R> downstream)

Java8

// TODO:後で書く

Java9

// TODO:後で書く
33
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
31