質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    15342questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

【Java】mapとFlatMapの違い

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 5,649
退会済みユーザー

退会済みユーザー

JaveのmapとflatMapの違いがよくわかりません。

以下のような具体例を頂けますと幸いでございます。
・mapでは処理できるがflatMapでは処理できない
・flatMapでは処理できるがmapでは処理できない

以下で理解しようとしてみましたが、理解ができませんでした。
StreamAPIについて調べてみた flatMap編 その1
ネストStreamと純粋ストリームがなにかが理解できません
Stream APIの主なメソッドと処理結果のOptionalクラスの使い方
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

mapが1対1に変換する処理なのに対して、
flatMapは1対nの変換です。(nは0以上)

同様に、mapに適用するラムダ式は、入力と出力の個数は同じですが、
flatMapに適用するラムダ式は、入力1に対して、0でも1でもそれ以上でも良いのです。
ただし結果はStreamなので、それらを内部で1つの 平坦な Streamに変換しています。だから名前にflatが付いているのです。


例:
// mapに適用するラムダ式
Function<String, String> f1 = x -> "-" + x + "-";

// flatMapに適用するラムダ式(1個から2個へ)
Function<String, Stream<? extends String>> f2 = x -> Stream.of(x, "***");

List<String> a1 = Stream.of("A", "B", "C").map(f1).collect(Collectors.toList());
System.out.println(a1);
// => [-A-, -B-, -C-]
//    3個

List<String> a2 = Stream.of("A", "B", "C").flatMap(f2).collect(Collectors.toList());
System.out.println(a2);
// => [A, ***, B, ***, C, ***]
//    6個

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/21 11:41

    argiusさん
    回答ありがとうございます。

    >>mapが1対1に変換する処理なのに対して、
    flatMapは1対nの変換です。(nは0以上)
    違いはやはり、これなんですね。
    難しく考えすぎていたようです。

    ありがとうございました。

    キャンセル

0

mapはこんな感じです。
--1-----2---------3---4-----
             |
           map(f)
             ↓
-f_1---f_2-------f_3-f_4----
要素それぞれに操作をして、結果を後段に流します。

flattenはこんな感じです。
  
--1-----2---------3---4-----
  2     3             7
        8             
             |
         flatten()
             ↓
--1-2---2-3-8-----3---4-7---
配列(など)が要素のストリームなどを展開して後段に流します。

flatMapはmapしてflattenです。
つまり配列を返すような操作を行うmapをして、
その結果を展開して後段に流します。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/21 11:43

    ozwkさん

    回答ありがとうございます。

    以下で回答にいただいている
    >>mapが1対1に変換する処理なのに対して、
    flatMapは1対nの変換です。(nは0以上)
    と同じ解釈でよろしいでしょうか?

    キャンセル

0

http://d.hatena.ne.jp/gloryof/20140419/1397900204

ストリームを直接返すかどうかの違いくらいみたいですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    15342questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。