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

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

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

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

Q&A

解決済

4回答

12237閲覧

Java メソッドを変数に格納したい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2017/05/11 08:43

以下のコードの for (int i = 1; getSeqFirst5Diff3ByIndex(i) <= num1; i++)の部分が長いので変数で見やすくしたいのですが、メソッドgetSeqFirst5Diff3ByIndex(int num2)を変数に格納するにはどこにどのように記述すればいいのでしょうか。
そもそもメソッド名が長いのは今回気にしないでください。
よろしくお願いします

Java

1import java.util.ArrayList; 2import java.util.List; 3 4public class Sequence4 { 5 6 public static void main(String[] args) { 7 List<Integer> answerList = getAllSeqFirst5Diff3LteAsList(50); 8 for (int i = 0; i < answerList.size(); i++) { 9 System.out.println(answerList.get(i)); 10 } 11 } 12 13 public static List<Integer> getAllSeqFirst5Diff3LteAsList(int num1) { 14 List<Integer> numericList = new ArrayList<Integer>(); 15 for (int i = 1; getSeqFirst5Diff3ByIndex(i) <= num1; i++) { 16 numericList.add(getSeqFirst5Diff3ByIndex(i)); 17 } 18 return numericList; 19 } 20 21 public static int getSeqFirst5Diff3ByIndex(int num2) { 22 return (5 + 3 * (num2 - 1)); 23 } 24} 25

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

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

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

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

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

guest

回答4

0

ベストアンサー

長い名前がいやなのは、それを何度も書くのがめんどくさいからと考えると・・・

  • 複数個所で呼び出したい。でもいちいち長い名前はいやだ

ヒント:メソッドを第一級関数的に扱う(関数的な値として変数に設定する)方法があります。

java

1public static List<Integer> getAllSeqFirst5Diff3LteAsList(int num1) { 2 IntUnaryOperator f = Sequence4::getSeqFirst5Diff3ByIndex; 3 List<Integer> numericList = new ArrayList<Integer>(); 4 for (int i = 1; f.applyAsInt(i) < num1; i++) { 5 numericList.add(f.applyAsInt(i)); 6 } 7 return numericList; 8}

ScalaやJavascriptであれば単純明快にf(引数)と書けますがJavaではf.apply(引数)としか書けないので少し残念です。

訂正:swordoneさんコメントによりIntFunctionからIntUnaryOperatorに変更しました。そうした方が不要なboxingがなくなるので効率がよくなります。

  • メソッド呼び出しを1か所で済むようにする(1)

ヒント:関数(メソッド)の適用結果を変数に代入しておく

java

1public static List<Integer> getAllSeqFirst5Diff3LteAsList(int num1) { 2 List<Integer> numericList = new ArrayList<Integer>(); 3 int n; 4 for (int i = 1; (n = getSeqFirst5Diff3ByIndex(i)) < num1; i++) { 5 numericList.add(n); 6 } 7 return numericList; 8}

変数nを不必要に広いスコープで宣言する点が少し気になります。for分の変数宣言部でnを宣言する手もありますが。条件判定式の中に代入文があるのを嫌う向きもいらっしゃると思います。

  • メソッド呼び出しを1か所で済むようにする(2)

ヒント:Streamで自然に呼び出しが1か所にできるならそれもよいでしょう。

java

1public static List<Integer> getAllSeqFirst5Diff3LteAsList(int num1) { 2 return IntStream.iterate(1, i -> i + 1) 3 .mapToObj(i -> getSeqFirst5Diff3ByIndex(i)) 4 .filter(n -> n <= num1) 5 .collect(Collectors.toList()); 6}

訂正:元のコードはStream.iterate, mapを使ってましたがIntStream.iterate, mapToObjに変更しました。

投稿2017/05/11 10:08

編集2017/05/11 21:15
KSwordOfHaste

総合スコア18392

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

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

退会済みユーザー

退会済みユーザー

2017/05/11 10:24

ありがとうございます!とても参考になりました!!
swordone

2017/05/11 14:27

ちなみに、int->intの関数型インタフェースには、IntUnaryOperatorと言うものがあります。メソッド名がapplyAsIntと長くなってしまいますが。
KSwordOfHaste

2017/05/11 21:12 編集

コメントありがとうございます。 IntUnaryOperatorにすればcollectの直前まではパイプライン上を全てintで扱えますが、自分には最終段でList<Integer>へ変換する簡便なコードがすぐ出てこなかったのと、最終段でboxingが必要なのでmap段階でboxingされてても効率はそう変わらないかなと考えました。 しかし、swordoneさんのコメントで自分のコードが中途半端だったと気づきました。IntFunctionならパイプライン初段はStream.iterateでなく、IntStream.iterateにし、mapの代わりにmapToObjとすべきでした。 --- 失礼しました。トンチンカンなことをコメントしてしまいました。最初の例の方ですね!最初の例の方はIntUnaryOperatorの方が適切だと思うので訂正しておきます。
swordone

2017/05/12 05:13

nを不必要に広いスコープで〜というのが気になるなら、nもforで宣言すればいいのでは。
KSwordOfHaste

2017/05/12 05:24

「for分の変数宣言部でnを宣言する手もありますが。」という一文ですませてしまいました。そうするのがいいかどうかについて自分は特に意見はありません。
swordone

2017/05/12 05:26

ごめんなさい、見落としてました。
guest

0

関数の部分を、関数のコードで置き換えたほうが判り易いかもしれませんね。

for (int i = 1; getSeqFirst5Diff3ByIndex(i) <= num1; i++) {

for (int i = 1; (5 + 3 * (i - 1)) <= num1; i++) {

にするという事です。

投稿2017/05/11 08:52

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2017/05/11 09:05

ありがとうございます!確かに見やすいです。参考になります 変数を使用する方法もしれたらうれしいです
guest

0

コレでしょう!

public static List<Integer> getAllSeqFirst5Diff3LteAsList(int num1) { List<Integer> numericList = new ArrayList<Integer>(); // for (int i = 1; getSeqFirst5Diff3ByIndex(i) <= num1; i++) { for (int i = 1; f(i) <= num1; i++) { numericList.add(getSeqFirst5Diff3ByIndex(i)); } return numericList; } public static int getSeqFirst5Diff3ByIndex(int num2) { return (5 + 3 * (num2 - 1)); } private static int f(int num2) { return getSeqFirst5Diff3ByIndex(num2); }

投稿2017/05/11 08:47

kunai

総合スコア5405

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

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

退会済みユーザー

退会済みユーザー

2017/05/11 09:05

ありがとうございます!とても参考になりました! 変数を利用する方法もありますか?
guest

0

https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/Function.html
http://qiita.com/opengl-8080/items/22c4405a38127ed86a31

ここらへん見ながら適当に書きました。なので文法的な解説は書けません。

java

1import java.util.ArrayList; 2import java.util.List; 3import java.util.function.Function; 4 5public class Main { 6 public static void main(String[] args) { 7 Function<Integer, Integer> getSeqFirst5Diff3ByIndex = n -> 5 + 3 * (n - 1); 8 9 List<Integer> answerList = getNumericList(50, getSeqFirst5Diff3ByIndex); 10 11 for (int i = 0; i < answerList.size(); i++) { 12 System.out.println(answerList.get(i)); 13 } 14 } 15 16 public static List<Integer> getNumericList(int n, Function<Integer, Integer> f) { 17 List<Integer> numericList = new ArrayList<Integer>(); 18 19 for (int i = 1; f.apply(i) <= n; i++) { 20 numericList.add(f.apply(i)); 21 } 22 23 return numericList; 24 } 25}

投稿2017/05/11 11:11

iwamoto_takaaki

総合スコア2883

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

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

退会済みユーザー

退会済みユーザー

2017/05/11 11:14

ありがとうございます。参考になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問