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

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

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

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

14554閲覧

アロー演算子を使うべき時はいつなのか

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

1クリップ

投稿2017/08/11 09:34

アロー演算子を使うべき時はいつなのでしょうか?

@Before public void setUp() throws Exception { interceptor = new ControllerInterceptor(); MessageSource mockMessageSource = mock(MessageSource.class); doAnswer(i -> { String key = i.getArgumentAt(0, String.class); assertThat(key, is(not(nullValue()))); Optional<String[]> argsOpt = Optional.ofNullable(i.getArgumentAt(1, String[].class)); return argsOpt.map(args -> key + Arrays.toString(args)).orElse(key); }).when(mockMessageSource).getMessage(anyString(), any(String[].class), any(Locale.class)); Whitebox.setInternalState(interceptor, "messageSource", mockMessageSource); Whitebox.setInternalState(interceptor, "isShowMessageDetail", true); locale = Locale.getDefault(); }

というコードがあって、この所々で出てくる

->

がよくわかりません。
ポインタからのメンバ関数呼び出しはアロー演算子を使う、というのが調べていて出てきたのですが、
ポインタとメソッドの違いもわかりませんでした...。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ポインタからのメンバ関数呼び出しはアロー演算子を使う、というのが調べていて出てきたのですが、

違う! 違います。それはC++でのアロー演算子の意味です。
Javaのアロー演算子は、ラムダ式の記述です。いや、こういう場面でラムダ式という言葉を使うのは公式名称ではあるのですが個人的には正しくないと思っているのでここでは「無名関数」と呼ばせてください。

java

1i -> { 2 // 処理いろいろ 3return 何か.toString(); 4}

と書くと、これは引数を一つ取って文字列の戻り値を返す関数を記述したことになります。

引数を一つといって、その引数の型は? それは自動で推論されます。質問文内のコードだと、doAnswerというメソッドが引数としてどういう関数を受け取ろうとしているかから推論されます。

投稿2017/08/11 10:25

yuba

総合スコア5568

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

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

anndonut

2017/08/11 11:18

ラムダ式と無名関数の違いは分かりませんが、無名メソッドでは?とは思いました。 しかし、何のクラスのメソッド?という話になるので、無名関数でOKなのかもしれません。 恐らく無名クラスの無名メソッドなのでしょうけれども…(むちゃくちゃすぎる)
yuba

2017/08/11 13:35

i です。
yuba

2017/08/11 13:45

>anndonutさん (これはもう何が正しいではなくて主義主張なのですが)メソッドと表現するか関数と表現するかだと、ここは関数だと主張します。メソッドというのはオブジェクト指向プログラミングの言葉ですが、Javaのラムダ式記法で生み出されるそれはオブジェクト指向に限定されない、もっと汎用的な存在だからです。本当に、引数を受け取って処理して結果を返すもの。だから無名関数、と。 ちなみに実装上は、それが記述されたクラスの、自動命名されたstaticメソッドになるようですね。えっ、関数型はJavaではinterface型なのに、staticメソッドじゃそれを実装した形にできないじゃない。そうなんですけど、そこはJDK7から登場した新しいJVM命令InvokeDynamicを使って動くようにしているんですと。
guest

0

LispやLL言語、関数型言語っぽいことをさせるためのものだと思います。
使用例をいくつか挙げておきます。

使用例1:フィルタリング
配列から3の倍数だけを抜き出す

javascript

1console.log([1,2,3,4,5,6,7].filter(function(x) { return (x%3===0); }));

java

1import java.util.List; 2import java.util.Arrays; 3import java.util.stream.Collectors; 4import java.util.stream.Stream; 5 6public class Main { 7 public static void main(String[] args) throws Exception { 8 List<Integer> ary = Arrays.asList(new Integer[]{1,2,3,4,5,6,7}); 9 List<Integer> filtered = ary.stream().filter(x -> {return (x%3 == 0);}) 10 .collect(Collectors.toList()); 11 System.out.println(filtered); 12 } 13}

実行結果

text

1[ 3, 6 ]

使用例2:畳み込み(fold)
配列の全要素の和を取る

javascript

1console.log([1,2,3,4,5,6,7,8,9,10] 2 .reduce(function(x, y) { return x + y; }, 0));

java

1import java.util.List; 2import java.util.Arrays; 3import java.util.stream.Collectors; 4import java.util.stream.Stream; 5 6public class Main { 7 public static void main(String[] args) throws Exception { 8 List<Integer> ary = Arrays.asList( 9 new Integer[]{1,2,3,4,5,6,7,8,9,10}); 10 Integer res = ary.stream() 11 .reduce((x, y) -> {return x + y;}).get(); 12 System.out.println(res); 13 } 14}

実行結果

text

155

使用例3:マップ演算
配列の全要素を2倍する

javascript

1console.log([1,2,3].map(function(x) { return 2*x; }));

java

1import java.util.List; 2import java.util.Arrays; 3import java.util.stream.Collectors; 4import java.util.stream.Stream; 5 6public class Main { 7 public static void main(String[] args) throws Exception { 8 List<Integer> ary = Arrays.asList( 9 new Integer[]{1,2,3}); 10 List<Integer> res = ary.stream() 11 .map(x -> { return 2 * x; }) 12 .collect(Collectors.toList()); 13 System.out.println(res); 14 } 15}

text

1[2, 4, 6]

あれ、C#だともっと簡単にできたはずなんだけどな...
Javaは古参の言語なんで勘弁してやってください。

以下の記事を参考にさせていただきました。
teratail - JavaでJavaScriptのArray.filterのようなことをしたいです。

投稿2017/08/11 12:39

anndonut

総合スコア667

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問