web-dev-qa-db-ja.com

メインメソッド内で関数を記述する-Java

Mainメソッド内にメソッドを記述できますか?たとえば、私はこのコードを見つけました:

public class TestMax {
     public static void main(String[] args) {
        int i = 5;
        int j = 2;
        int k = max(i, j);
        System.out.println("The maximum between is " + k);
     }

     public static int max(int num1, int num2) {
        int result;
        if (num1 > num2)
           result = num1;
        else
           result = num2;

        return result; 
     }
}

メソッドmaxをメインメソッド内にコーディングできますか?

8
user3126119

Java 8が出たら、メインメソッドでmaxメソッドを定義できるようにClosure/Lambda機能で作成する必要があります。それまでは、メソッドを定義できるのは特別な状況での主な方法。

たまたま、あなたの質問は特別な状況に分類されます。同じタイプの2つのものを比較するロジックをカプセル化するインターフェース(Comparable)があります。その結果、コードは次のように書き直すことができます。

public class TestMax {
  public static void main(String[] args) {
    int i = 5;
    int j = 2;
    Comparator<Integer> compare = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            // Because Integer already implements the method Comparable,
            // This could be changed to "return o1.compareTo(o2);"
            return o1 - o2;
        }
    };
    // Note that this will autobox your ints to Integers.
    int k = compare.compare(i, j) > 0 ? i : j;
    System.out.println("The maximum between is " + k);
  }
}

これが機能するのは、標準のJavaディストリビューションにコンパレータインターフェースがすでに存在するためです。ライブラリを使用すると、コードを改善できる可能性があります。このコードを記述している場合は、Google Guavaをクラスパス。次のように書くことができます:

public class TestMax {
  public static void main(String[] args) {
    int i = 5;
    int j = 2;
    // The 'natural' ordering means use the compareTo method that is defined on Integer.
    int k = Ordering.<Integer>natural().max(i, j);
    System.out.println("The maximum between is " + k);
  }
}

あなたの質問は、注文番号(およびその他のもの)に関連する標準的なプラクティスではなく、Java言語の能力に関するものであったと思われます。したがって、これは役に立たないかもしれませんが、私は念のため共有します。

6
Spina

いいえ、メソッドを別のメソッド内で宣言することはできません。

提供したコードをよく見ると、フォーマットが正しくない場合、mainメソッドはmaxメソッドが宣言される前に終了します。

7
Keppil

はい、これはlembda式で可能です。そのためには、少なくともJava 8を使用する必要があります

import Java.util.function.BiFunction;

public class TestMax {
    public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> max = (a,b)-> a>b ? a : b;

        //now you can call method

        int i = 5;
        int j = 2;
        int k = max.apply(i, j);
        System.out.println("The maximum between is " + k);
    }
}

BiFunctionは関数型インターフェイスですJavaコンパイラはラムダ式コードを内部的に匿名クラスとして変換し、BiFunctionインターフェイスを実装し、コードを含むapply()メソッドをオーバーライドします

内部(コンパイラを考慮)コードは次のとおりです。

BiFunction<Integer, Integer, Integer> max = new BiFunction<Integer, Integer, Integer>(){
    public Integer apply(Integer a, Integer b){
        return a>b ? a : b; //your code
    }
}

いいえ。Javaのメソッドでメソッドを直接定義することはできません。組み込みのクラスで事前に宣言されたメソッドなどの特別な条件を除きます。望ましいメソッドは、同じクラスのメソッドを定義し、当然それを呼び出すことです。

1
Kapil Tapsi

これを使用する場合は、このシナリオでstaticにして、クラスに配置しますが、メインメソッドの外側に配置します(コード内にあるため)。その後、main()内から呼び出すことができます。

1
Jim Garrison

君は cannot directly define methods他のメソッドの内部Java(メインメソッドも))。

You should write the method in the same class as main. 

注:別のメソッド内のメソッドでクラスを宣言できます

1

適切なフォーマットを使用すると、maxメソッドがmainメソッドと同じクラスに表示されますが、mainメソッドにはありません。

1
Mad Physicist