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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

1回答

589閲覧

JAVA Stream APIを使用してDB参照データをリクエストIDの順番で出力したいです

ksppy3500

総合スコア3

Java

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

1グッド

0クリップ

投稿2022/11/14 08:02

前提

JAVAで以下のような実装をしているのですが、こちらをfor文を使用せずstream一本で
おそらくflatMap等、使用して実装できるかと思うのですが、具体的にどのように実装したら良いのでしょうか?

for (ID id : idLists) { returnList.addAll( idDatas.stream() .filter(data -> data.getId().equals(id)) .collect(Collectors.toList())); }

idListはリクエストされたList<ID>のリストで
idDatasはidListを使用しDBから取得したList<dataEntity>となっております。
※dataEntityはidとnameだけのクラスです。

最終的に、idDatasを出力するのですが、idListを使用しDBから取得するとリクエストされた順番とは異なってしまいます。
(↑SQL実行でリクエストパラメータ順にorder by を指定する方法は無しで考えたいです。)
ですので出力前に上記のような処理をかませ並び替えております。

実現したいこと

  • stream API一本で記載したい
  • リクエストされたidListの順でDB参照値のidDatasが出力されること

試したこと

以下のような記載で実現できるかと考えているのですが、具体的にどのように記載すればよいのか分からずエラーとなっています

returnList.addAll( idDatas.stream() .flatMap(x -> idLists.stream().filter(id -> x.getId().equals(id)) .collect(Collectors.toList()));
ksppy3500👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/11/14 10:05 編集

>idListはリクエストされたList<ID>のリストで ~ データベースは直接は関係無さそうですし、構造を言葉で表すよりはコードで示されたほうが確実です。 必要なクラスと必要なリストに必要な(ダミー)データを入れ、ストリームのコードを実行した結果どのようになる(表示処理を入れれば実行したらこう表示される)のか、入力・処理・出力のうち入力と出力がハッキリすればコードの成否もハッキリします。 (stream である必要も無いかもしれませんし。)
ksppy3500

2022/11/14 13:30

ありがとうございます。 確かに言葉で説明するだけでは分かりづらく 入出力の例があるだけで、だいぶイメージしやすくなりますね!
guest

回答1

0

ベストアンサー

とりあえず並び替えなら (for はともかく stream でも無く) List.sort で十分なのではということで。
(どうしても stream なら sorted 。)

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) { 5 List<Data> idDatas = new ArrayList<>(); 6 idDatas.add(new Data(1, "AAA")); 7 idDatas.add(new Data(2, "BBB")); 8 idDatas.add(new Data(3, "CCC")); 9 idDatas.add(new Data(4, "DDD")); 10 idDatas.add(new Data(5, "EEE")); 11 idDatas.add(new Data(6, "FFF")); 12 System.out.println("-- idDatas ------"); 13 idDatas.stream().forEach(System.out::println); 14 15 List<Long> idLists = new ArrayList<>(); 16 for(Data d : idDatas) idLists.add(d.id); 17 Collections.shuffle(idLists); 18 System.out.println("-- idLists ------"); 19 idLists.stream().forEach(System.out::println); 20 21 List<Data> returnList = new ArrayList<>(idDatas); 22 returnList.sort((a,b)->idLists.indexOf(a.id)-idLists.indexOf(b.id)); 23 /* 24 List<Data> returnList = idDatas.stream() 25 .sorted((a,b)->idLists.indexOf(a.id)-idLists.indexOf(b.id)) 26 .collect(Collectors.toList()); 27 */ 28 System.out.println("-- returnList ------"); 29 returnList.stream().forEach(System.out::println); 30 } 31 32 private static class Data { 33 final long id; 34 final String name; 35 Data(long id, String name) { 36 this.id = id; 37 this.name = name; 38 } 39 @Override 40 public String toString() { 41 return getClass().getSimpleName()+"[id="+id+",name="+name+"]"; 42 } 43 } 44}

実行結果

plain

1-- idDatas ------ 2Data[id=1,name=AAA] 3Data[id=2,name=BBB] 4Data[id=3,name=CCC] 5Data[id=4,name=DDD] 6Data[id=5,name=EEE] 7Data[id=6,name=FFF] 8-- idLists ------ 93 101 116 122 135 144 15-- returnList ------ 16Data[id=3,name=CCC] 17Data[id=1,name=AAA] 18Data[id=6,name=FFF] 19Data[id=2,name=BBB] 20Data[id=5,name=EEE] 21Data[id=4,name=DDD]

投稿2022/11/14 10:32

編集2022/11/14 12:52
jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ksppy3500

2022/11/14 13:21

ご回答ありがとうございます! このような簡単な方法が、あったのですね! streamを使用する場合の実装例までありがとうございます。 とても助かりました🙇‍♂️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問