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