0Pricing
Java Academy · レッスン

IntStream と LongStream

ストリームでボックス化を避けます。

「IntStream と LongStream」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

プリミティブストリームが存在する理由

Stream<Integer>はすべての要素をIntegerオブジェクトにボックス化します。IntStream、LongStream、DoubleStreamはプリミティブ値を直接扱い、ボックス化のオーバーヘッドを避けます。

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sum = IntStream.of(1, 2, 3, 4).sum();
        System.out.println(sum);
    }
}

IntStreamの作成

明示的な値にはIntStream.ofを使い、int[]からストリームを作成するにはArrays.streamを使います。

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int[] data = {10, 20, 30};
        IntStream s = Arrays.stream(data);
        System.out.println(s.max().getAsInt());
    }
}

大きな数値にはLongStream

LongStreamはIntStreamに対応しますが、long値を扱うため、大きな合計値でのオーバーフローを避けられます。

import java.util.stream.LongStream;

public class Main {
    public static void main(String[] args) {
        long total = LongStream.of(1_000_000_000L, 2_000_000_000L).sum();
        System.out.println(total);
    }
}

専用の終端操作

プリミティブストリームには、オブジェクトストリームにはない数値用メソッドが追加されています。sum、min、max、averageなどです。

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream nums = IntStream.of(4, 8, 15, 16, 23, 42);
        System.out.println(nums.average().getAsDouble());
    }
}

OptionalIntの結果

ストリームが空の場合もあるため、minとmaxはOptionalIntを返します。getAsIntまたはorElseを使ってください。

import java.util.OptionalInt;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        OptionalInt result = IntStream.empty().max();
        System.out.println(result.orElse(-1));
    }
}

mapはプリミティブのまま処理する

IntStreamに対するmapはIntUnaryOperatorを受け取り、別のIntStreamを返すため、ボックス化は発生しません。

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sumOfSquares = IntStream.of(1, 2, 3)
            .map(n -> n * n)
            .sum();
        System.out.println(sumOfSquares);
    }
}

プリミティブストリームでのfilter

filterはIntPredicateを受け取り、条件に一致するプリミティブ値を残します。

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long evens = IntStream.of(1, 2, 3, 4, 5, 6)
            .filter(n -> n % 2 == 0)
            .count();
        System.out.println(evens);
    }
}

IntStreamでのreduce

reduceはIntBinaryOperatorを使ってストリームを畳み込みます。初期値を指定すると、intを直接返します。

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int product = IntStream.rangeClosed(1, 5)
            .reduce(1, (a, b) -> a * b);
        System.out.println(product);
    }
}

プリミティブに対するforEach

forEachはIntConsumerを受け取り、ここでもボックス化を避けます。

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.of(7, 8, 9).forEach(n -> System.out.println(n));
    }
}

配列への収集

toArrayはプリミティブのint[]を返します。これはIntStreamに対応する自然な形式です。

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int[] doubled = IntStream.of(1, 2, 3).map(n -> n * 2).toArray();
        System.out.println(Arrays.toString(doubled));
    }
}

IntとLongの変換

IntStream.asLongStreamは、ボックス化せずにプリミティブの型をlongへ拡張します。

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long sum = IntStream.of(1, 2, 3).asLongStream().sum();
        System.out.println(sum);
    }
}

理解度チェック

Stream<Integer>ではなくIntStreamを使う主な理由は何ですか。

まとめ

ボックス化を避けるためにプリミティブストリームを使いました。

  • IntStreamとLongStreamはプリミティブ値を直接保持します。
  • 数値用の終端操作として、sum、min、max、averageが追加されています。
  • minとmaxはOptionalIntを返します。
  • map、filter、reduce、toArrayはすべてプリミティブのまま処理します。

よくある質問

「IntStream と LongStream」レッスンは無料ですか?

はい。「IntStream と LongStream」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「IntStream と LongStream」で何を学びますか?

ストリームでボックス化を避けます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「IntStream と LongStream」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. IntStream と LongStream
  2. 範囲と集約操作
  3. Object ストリームとの相互変換
  4. プリミティブストリームの生成
← Java Academyに戻る