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

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

ただいまの
回答率

90.49%

  • Java

    14075questions

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

Java8のStreamを使用してfor文をなくす手段

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,078

satoT

score 1

前提・実現したいこと

java8でのStreamの使い方についての質問です

createHogeKeyでdto.getId()をいれてkeyを作成して
そのKeyをもとにhogeDao.select(hogeKey)で
データベースからの戻り値を入手しhogeListにいれ
その値の一部をcopyで変換してkekkaListにいれる。

発生している問題・エラーメッセージ

for文をStreamに変えるにはどうしたらいいのでしょうか

該当のソースコード

List<String> kekkaList = new ArrayList<String>();
for (testDto dto : testList) {
    hogeKey  = createHogeKey(dto.getId());
    hogeList = hogeDao.select(hogeKey);
    kekkaList.add(copy(dto, hogeList));
}

試したこと

課題に対してアプローチしたことを記載してください
kekkaList.stream()
  .map(cnt -> createHogeKey(dto.getId()));
続けて記述のしかたや、戻り値がない終わり方のためここからよくわかりません。

すいません、試したことの記述がおかしかったので修正しました。

補足情報(言語/FW/ツール等のバージョンなど)

java8

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • RyotaKondo

    2016/05/13 18:50

    回答者として未知の情報が多すぎて答えようが無いです。「実現したいこと」に記述されていることをもう少し詳しくお願いします。また、「試したこと」の内容も元のコードと違いすぎてよくわからないです(testListとcntListはおなじもの?genMstDivKeyは元のコードに無いのだけども?)

    キャンセル

  • swordone

    2016/05/13 22:36

    copy(dto, hogeList)のdtoは必要ですか?

    キャンセル

  • satoT

    2016/05/15 13:00

    すいません、試したことの記述が間違っていたため修正しました。 copy(dto, hogeList)のdtoは必要ですが、これはkekkaListの中のdtoになります。 すいません、ちょっと例がまずかったようなのでもう少し質問内容を精査します。

    キャンセル

回答 2

+3

ストリームの処理から何か結果を得るには、終端処理というのが必要になります。
例えば、forEachメソッドでは、結果に対してfor文と同じようなことができます。
reduceメソッドは結果のコレクションを集約した結果を得ます。

ストリームを再びコレクションとして取得するには、collectメソッドを使います。
このメソッドは、通常Collectorsというユーティリティークラスと合わせて使います。

Collectors.toListメソッドを使えば、ストリームの処理結果をListで取得できます。

forEach,reduce,collectはいずれも終端処理のメソッドです。)

ちょっと簡略化したバージョンで書いてみるとこうなります。

// import java.util.*;
// import java.util.stream.Collectors;

public static void main(String[] args) {
    List<Integer> testList = Arrays.asList(1, 2, 3);
    List<String> kekkaList = testList.stream().map(id -> {
        return genMstDivKey(id);
    }).collect(Collectors.toList());
}

static String genMstDivKey(int id) {
    return "ID" + id;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

もともとのfor文をそっくりそのまま活かすなら…

List<String> kekkaList = testList.stream().map(dto -> {
    型名 hogeKey  = createHogeKey(dto.getId());
    List<型名> hogeList = hogeDao.select(hogeKey);
    return copy(dto, hogeList);
}).collect(Collectors.toList());

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    JavaのMap内容の列挙について

    Javaで、Mapの情報をすべて列挙したい場合の効率のいい処理方法ってありませんか? どなたか教えてください。 宜しくお願いします。

  • 解決済

    単語ごとの出現回数を出現順に表示するには、HashMapとArrayListが必要か

    単語ごとの出現回数を出現順に表示するには、HashMapとArryaListが必要でしょうか。 下記の例よりももっとスマートかつコード量が少なく使用するメモリの量が少ない方法がある

  • 解決済

    javaで効率のよい書き方

    いつもお世話になっております。 今回は効率化(?)について質問させていただきます。 やりたいこと String型の配列に入っている”2016/07/20”という文字列

  • 解決済

    ジェネリクスについて

    API仕様書で、 以下のような記述を見かけますが、 ここで指定されているジェネリクスがどういう意味を表しているのかがわかりません。 例)java.util.stream.

  • 解決済

    配列の分割方法について

    問題点 以下のような配列 String str[]={"ABC","DEFG","HI","KLM"} というのがあったとして、これを new_str[]={"A","B",・・・

  • 受付中

    表の作成方法について

    DATE     ANSWER  COUNT   2018/01/01     〇        1 2018/01/01     ×        1 2018/01/01   

  • 解決済

    連想配列をソートし、リストに変換する

     前提・実現したいこと 趣味でjavaを勉強しているものです。連想配列をvalueで昇順ソートしたのち、Listに変換するプログラムを作りたいのですが、このときに配列を二つ用意して

  • 解決済

    Mapインターフェースの引数の順番について

    生徒をグループ分けするプログラムのなかでMapインターフェースの引数を以下のように入れ替えてみたところ「引数の型が合わない」とエラーになりました。 Map<List<Stude

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

  • Java

    14075questions

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