0Pricing
Java Academy · レッスン

Object ストリームとの相互変換

mapToObj と mapToInt です。

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

2種類のストリーム

Javaにはオブジェクトストリーム(Stream<T>)とプリミティブストリーム(IntStreamなど)があります。マッピングメソッドを使うと、両者の間を変換できます。

import java.util.stream.IntStream;

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

mapToObj:プリミティブからオブジェクトへ

mapToObjは各プリミティブ値をオブジェクトに変換し、Stream<T>を生成します。

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        List<String> labels = IntStream.rangeClosed(1, 3)
            .mapToObj(n -> "item-" + n)
            .collect(Collectors.toList());
        System.out.println(labels);
    }
}

mapToInt:オブジェクトからプリミティブへ

mapToIntは各オブジェクトからintを取り出し、数値の集約に使えるIntStreamを生成します。

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("hi", "hello", "hey");
        int totalChars = words.stream()
            .mapToInt(String::length)
            .sum();
        System.out.println(totalChars);
    }
}

boxed:プリミティブからラッパーストリームへ

boxedはIntStreamをStream<Integer>に変換します。Listに収集する前にこの変換が必要です。

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = IntStream.rangeClosed(1, 5)
            .boxed()
            .collect(Collectors.toList());
        System.out.println(list);
    }
}

mapToLongとmapToDouble

他のプリミティブでも同じパターンが使えます。mapToLongとmapToDoubleです。

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> prices = List.of("9.99", "19.50", "4.25");
        double total = prices.stream()
            .mapToDouble(Double::parseDouble)
            .sum();
        System.out.println(total);
    }
}

mapよりmapToIntが適している理由

オブジェクトストリームでmapを使うと、ボックス化されたままになります。mapToIntを使うと、ボックス化を避けながらsumやaverageなどの数値用メソッドを利用できます。

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> nums = List.of(10, 20, 30);
        double avg = nums.stream()
            .mapToInt(Integer::intValue)
            .average()
            .getAsDouble();
        System.out.println(avg);
    }
}

往復変換:オブジェクトからIntへ、そしてオブジェクトへ

1つのパイプラインで両方向に変換できます。数値を取り出し、変換してから、オブジェクトに戻します。

import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("a", "bb", "ccc");
        List<String> report = words.stream()
            .mapToInt(String::length)
            .mapToObj(len -> "len=" + len)
            .collect(Collectors.toList());
        System.out.println(report);
    }
}

asLongStreamとasDoubleStream

プリミティブストリーム内では型を拡張できます。asLongStreamとasDoubleStreamは、数値の幅を変更しながらボックス化を避けます。

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        double avg = IntStream.of(1, 2, 3, 4)
            .asDoubleStream()
            .average()
            .getAsDouble();
        System.out.println(avg);
    }
}

プリミティブの結果の収集

プリミティブ値をコレクションに集めるには、最初にboxedを呼び出してから、コレクターを使います。

import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        Set<Integer> evens = IntStream.rangeClosed(1, 10)
            .filter(n -> n % 2 == 0)
            .boxed()
            .collect(Collectors.toSet());
        System.out.println(evens);
    }
}

flatMapToInt

flatMapToIntはオブジェクトを1つのIntStreamに平坦化します。各オブジェクトが複数の数値を生成する場合に便利です。

import java.util.List;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        List<int[]> rows = List.of(new int[]{1, 2}, new int[]{3, 4});
        int sum = rows.stream()
            .flatMapToInt(Arrays::stream)
            .sum();
        System.out.println(sum);
    }
}

適切なマッピングメソッドの選択

変換の方向で選んでください。

  • オブジェクトからプリミティブへ:mapToInt、mapToLong、mapToDouble。
  • プリミティブからオブジェクトへ:mapToObjまたはboxed。
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> in = List.of("x", "yy");
        String out = in.stream()
            .mapToInt(String::length)
            .mapToObj(Integer::toString)
            .collect(Collectors.joining(","));
        System.out.println(out);
    }
}

理解度チェック

IntStreamをStream<Integer>に変換するメソッドはどれですか。

まとめ

オブジェクトストリームとプリミティブストリームの間を変換しました。

  • mapToInt/mapToLong/mapToDoubleはオブジェクトからプリミティブへ変換します。
  • mapToObjとboxedはプリミティブからオブジェクトへ変換します。
  • flatMapToIntは複数の数値を1つのIntStreamに平坦化します。
  • プリミティブストリームに変換すると、ボックス化せずに数値を集約できます。

よくある質問

「Object ストリームとの相互変換」レッスンは無料ですか?

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

「Object ストリームとの相互変換」で何を学びますか?

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

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

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

「Object ストリームとの相互変換」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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