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

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

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

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

Q&A

解決済

2回答

469閲覧

Java 内部クラスのインスタンス化について教えてください

SatoshiPixy

総合スコア13

Java

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

0グッド

1クリップ

投稿2018/10/31 13:54

下記コードについて、「”バナナ”と表示される為には以下のように変更すると出来る」と聞いたのですが、その理由が分かりません。

変更内容:(下:8行目)ItemFilterクラスのisValidメソッドをstaticメソッドに変更する

  1. List<Item> items = Arrays.asList(
  2. new Item("りんご", 3),
  3. new Item("バナナ", 20));
  4. items.stream()
  5. .filter(Item.ItemFilter::isValid)
  6. .forEach(System.out::println);

// Item クラスの実装

  1. public class Item {
  2. String name; int qty;
  3. public String toString() { return name; }
  4. public Item(String name, int qty) {
  5. this.name = name; this.qty = qty;
  6. }
  7. static class ItemFilter {
  8. public boolean isValid(Item i) {           ⇒変更箇所
  9. return i.qty >= 5;
  10. }
  11. }
  12. }

内部クラスのインスタンス化(上:5行目).filter(Item.ItemFilter::isValid))がポイントとの事なんですが、全く理由が分かりません。
プロフェッショナルの方、ご教示いただけないでしょうか。

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

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

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

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

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

SatoshiPixy

2018/11/10 12:15

ありがとうございました。
guest

回答2

0

現在、isValidメソッドはstaticメソッドではないため、インスタンスなしに起動することが出来ないのです。
staticメソッドであればクラス名からだけでアクセスできるので、その修正で動くのです。

メソッド参照の形だとわかりにくいのですが、filterの部分を無名クラスとして書くとこうなります。

java

1 .filter(new Predicate<Item>(){ 2 public boolean test(Item i) { 3 return Item.ItemFilter.isValid(i); // コンパイルエラー 4 } 5 })

こう書くとおかしなことであることが少しわかりやすいのではないでしょうか。
ItemFilterまではstaticなのでインスタンスなしでクラス名だけでアクセスできるのですが、
isValidはItemFilterのインスタンスからでないと使えないメソッドです。

投稿2018/10/31 14:29

編集2018/10/31 18:45
swordone

総合スコア20651

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

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

0

ベストアンサー

コードにコメント入れてみました。
本来、行の上にコメントすべきところを、わざと下に入れてます。

java

1List<Item> items = Arrays.asList( 2 new Item("りんご", 3), 3 new Item("バナナ", 20)); 4 // ---> リンゴの個数(3) < バナナの個数(20) 5 6items.stream() 7 .filter(Item.ItemFilter::isValid) 8 // ---> itemsの各要素にisValidメソッドを適用して(Item.ItemFilter::isValid(item))、返り値がtrueのものだけに絞る(フィルターする) 9 // 今回の場合、バナナの個数だけ5個以上なので、バナナだけに絞られる 10 .forEach(System.out::println); 11 // ---> 絞った結果の各要素を出力する(System.out::println(item.toString())) 12 13public class Item { 14 String name; int qty; 15 public String toString() { return name; } 16 public Item(String name, int qty) { 17 this.name = name; this.qty = qty; 18 } 19 static class ItemFilter { 20 // ---> staticなこと、内部クラスなことは、他の方の回答を参考に 21 public boolean isValid(Item i) {           ⇒変更箇所 22 return i.qty >= 5; 23 // ---> 個数が5以上であればtrueを返す 24 } 25 } 26} 27 28

投稿2018/10/31 14:31

編集2018/10/31 14:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SatoshiPixy

2018/11/10 12:15

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問