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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- IntStream と LongStream
- 範囲と集約操作
- Object ストリームとの相互変換
- プリミティブストリームの生成