1. 導入:なぜPrimitive Streamsが重要なのか
JavaのStream APIを扱う際、何気なくListやSetからStreamを生成し、map(Integer::valueOf)のように記述していませんか?実は、ジェネリクスを用いたStream
2. 基礎知識:Primitive Streamsとは何か
Primitive Streamsとは、Java 8から導入された「プリミティブ型(int, long, double)を直接扱うためのStream」です。
通常のStream
3. 実装/解決策:数値処理の最適化
コレクションから数値計算を行う際は、一度Stream
4. サンプルプログラム:実務で役立つ数値処理の例
以下は、商品リストから価格の合計と平均を算出する際の実用的なコード例です。
import java.util.Arrays;
import java.util.List;
public class PrimitiveStreamSample {
public static void main(String[] args) {
List products = Arrays.asList(
new Product("Laptop", 120000),
new Product("Mouse", 3000),
new Product("Keyboard", 8000)
);
// mapToIntを使用してIntStreamに変換することで、効率的に合計を算出
int total = products.stream()
.mapToInt(Product::getPrice)
.sum();
// average()はOptionalDoubleを返すため、値が存在する場合のみ表示
products.stream()
.mapToInt(Product::getPrice)
.average()
.ifPresent(avg -> System.out.println("平均価格: " + avg));
System.out.println("合計金額: " + total);
}
}
class Product {
private String name;
private int price;
public Product(String name, int price) {
this.name = name;
this.price = price;
}
public int getPrice() { return price; }
}
5. 応用・注意点:現場で陥りやすい罠
注意点1:Optionalの扱い
IntStreamのaverage()などは「値が存在しない(空のストリーム)」ケースを考慮してOptionalDoubleを返します。単純にget()を呼ぶと例外が発生する可能性があるため、必ずifPresent()やorElse()でフォールバック処理を記述してください。
注意点2:無限ストリームの罠
IntStream.range(0, Integer.MAX_VALUE)のような無限ストリームを生成する場合、適切にlimit()をかけないとメモリオーバーフローや無限ループに陥ります。
現場のTips:
大きなデータを扱う場合、並列処理を簡単に行えるのもPrimitive Streamsの強みです。もし大量の数値計算でボトルネックが発生しているなら、stream()をparallelStream()に変えるだけで、マルチコア環境の恩恵を最大限に引き出せます。ただし、スレッドセーフには十分注意して設計してください。

コメント