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

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

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

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

Q&A

解決済

1回答

14711閲覧

JavaでListの情報をDtoに一行でいれたい

java40

総合スコア7

Java

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

0グッド

0クリップ

投稿2016/08/19 07:16

###前提・実現したいこと
Javaで実装したいのですが
List<DTOA> list = new ArrayList<DTOA>();
for (int i=0;i<10;i++) {
DTOA dtoA = new DTOA();
dtoA.getCount(i);
list.add(dtoA);
}

DTOB dtoB = new DTOB();
dtoB.setCount1(list.get(0).getCount());
dtoB.setCount2(list.get(1).getCount());
dtoB.setCount3(list.get(2).getCount());
dtoB.setCount4(list.get(3).getCount());
dtoB.setCount5(list.get(4).getCount());
dtoB.setCount6(list.get(5).getCount());
dtoB.setCount7(list.get(6).getCount());
dtoB.setCount8(list.get(7).getCount());
dtoB.setCount9(list.get(8).getCount());
dtoB.setCount10(list.get(9).getCount());

このdtoBにいれるところを、Streamなどを使用して1行でかけたりしないでしょうか?
よろしくお願いします。

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

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

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

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

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

matobaa

2016/08/19 08:47 編集

小さなプログラムだと逆に遅くなりそうなやりかたならありそうなのですけど、Streamなどを使用して1行で書きたい理由ってなんでしょうか? setCount999がたーーくさんあるとか?
java40

2016/08/19 09:38

setCountがたくさんあるので、ソースを見たときにもっとコンパクトに綺麗にできないかと思いまして、ただ速度が落ちるようならあきらめようと思います。
退会済みユーザー

退会済みユーザー

2016/08/19 10:32

いくらがんばって考えてもも10行前後になるや。 ※ リフレクションなのでおそくなる setCountN の設計を根本から変えないとダメかと
退会済みユーザー

退会済みユーザー

2016/08/19 10:36

DXOを作ってそこにつらつら書いた方がいいかもしれない。
guest

回答1

0

ベストアンサー

できたできた。

DTOB 側に、番号で指定されたメソッドを返すメソッドを書いておけば:

java

1// DTOB.java 2IntConsumer[] intConsumers = new IntConsumer[] { 3 this::setCount1, this::setCount2, this::setCount3, 4 this::setCount4, this::setCount5, this::setCount6, 5 this::setCount7, this::setCount8, this::setCount9, this::setCount10 }; 6public IntConsumer getFunction(int index) { return intConsumers[index-1]; }

こんな感じで呼び出せます:

java

1 IntStream.rangeClosed(1, 10).parallel().forEach( 2 i -> {dtoB.getFunction(i).accept(list.get(i-1).getCount());} 3 );

parallel() は別に使わなくてもいいですけど。

Stream#zip() を使えば、もっとすっきり書けるはず。

メソッド数がとても多ければ parallel の効果がでるかもしれない……

投稿2016/08/19 11:42

編集2016/08/19 11:46
matobaa

総合スコア2493

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

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

java40

2016/08/22 00:08

有難う御座います。 JavaでのStream#zip()はなかったはずなので、どうしようかと思いまして。 試してみます。
matobaa

2016/08/22 02:26

いちおうStream使ってみましたが、やっぱりharuka-kanataさんが言うようにsetCountN の設計を見直すか、DXOを書くのがきれいだと思います。 Stream#zip() 欲しいです! いまはないけど
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問