このラムダ式のコードを読んで、JAVAを渡すパラメータ方法の理解のあなたのレベルをテスト

直接の質問に、最初にすべての私たちは次のようにUERがオブジェクトを持っています:

static class Student {
    private String name;
    private int score;
    private int star;
    Student(String name, int score, int star){
        this.name = name;
        this.score = score;
        this.star = star;
    }
    //省略get set方法
}

その後、我々は、シナリオ前提としていますよりも大きいのか、60ポイントを獲得するために等しいプラス学生がスターを持っており、学生の情報を出力します。

達成するためのコードを見てください:

public static void main(String[] args) {
    List<Student> students = new ArrayList<>();
    for (int i=0; i<10; i++){
        Student student = new Student("student" + i, 55+i, 0);
        students.add(student);
    }
    //过滤用户
    filterUser(students);
    students.forEach(student -> System.out.println(student.getName() + "|" + student.getScore() + "|" + student.getStar()));
}

private static void filterUser(List<Student> students){
    students = students.stream().filter(student -> student.getScore() >= 60).collect(Collectors.toList());
    students.fo
}

あなたはどのような結果出力そう考えることができます。そして、次のような出力を見て、あなたが望むことは同じではありません。

student0|55|0
student1|56|0
student2|57|0
student3|58|0
student4|59|0
student5|60|1
student6|61|1
student7|62|1
student8|63|1
student9|64|1

学生はそれから出力を通過しない理由を私たちは、学生が出力student5〜9である必要があり、私たちの通常の考え方によると、上記の出力から見ることができますか?フィルタ条件の役割を果たしてはいけない、しかし、学生student5〜9の星は確かに彼らは、ああ、魚のフィルタ効果があるはずと言う、1を追加しました。

さて、最初の秘密、あなたの顔の質問をするための強力な兄:

Q:文が正しいオプションのJavaの質量の参加の道を、次のとおりです。

  1. Javaは参照によって渡されたパラメータを渡す方法です。

  2. Javaのパラメータ渡しモードは値によって渡されます。

  3. それは値によって渡された値である場合に参照によって渡された値を送信する、コンテンツ配信条件は、区別されます。参照は、参照によって渡された場合。

  4. これは、値によって渡されるパラメータの基本的な種類、および参照によって渡された場合のオブジェクトとして渡された場合。

答えは次のとおりです。(9 + 7-10)/ 3。(誰もが直接答えを見てみましょうするために、我々は、上記の式は、完全な結果を得ることができます計算します)。

まあ、はい、Javaの質量の参加が唯一の方法であり、その値によって渡されます。私は答えは4になり、多くの人々、基本的なタイプは、Javaおよび多くの言語は、この値はよく理解されているのと同じパスを使用すると信じていますが、オブジェクト型ならば、参照することによって渡されていませんか?ここでは、最初の並べ替え参照の伝送および配信の低い値との差異アウトしなければなりません:

  • 値の転送は、(値渡し)関数で変更パラメータは、実際のパラメータに影響を与えない場合、実際のパラメータは、そう、関数に渡された関数のコピーを呼び出すときをいいます。

  • 参照渡して行う、それは機能の実際のパラメータに影響するパラメータを変更し、その後、関数を呼び出す際に、直接関数に渡される実引数に取り組むことを意味する(参照渡し)。

それは、参照によって渡されたオブジェクトへの参照を渡すために私たちの方法ではありませんが、それが何であるかの関数に渡された外観は、パラメータに対応する実際のパラメータ値のコピー、または実際の物理アドレスです。

それは理解しにくいかもしれないが、我々は、オブジェクトの画像の転送の例を与えます:

(あなたの友人があなたの家(ヒープ具体的なオブジェクト)に行きたいときは、キー(オブジェクト参照スタック内のアドレス)を持っていて、直接彼にあなたの鍵を入れた場合、参照渡しされますまた、アドレスパラメータ法に対応するオブジェクト参照)に対応します。彼がした場合は、この場合には、このための鍵は、何が起こったのか、例えば、彼は(変更されたアドレスオブジェクト参照)のキー、そしてあなた自身の鍵が壊れたあなたに、このキーバックで破りましたこれは置きます。

そして、あなたはあなたの友人があなたの家に行きたいとき、あなたはスタック内の元のオブジェクトへの参照を使用して新しいキー(新しいオブジェクト参照を、刻まれた、キー(オブジェクト参照スタック内のアドレス)を持っている場合異なるアドレス値が、アドレス(オブジェクトのアドレス・ポイント)に格納された値は、まだ値によって渡され、彼自身の手で、彼に)同じです。この場合、彼はこれはあなたの手でこのキーには影響しません何をキーに置きます。

そして、Javaは、唯一の基準値は転送せずにそこに渡されています!そして、Javaは、唯一の基準値は転送せずにそこに渡されています!そして、Javaは、唯一の基準値は転送せずにそこに渡されています!

三回言うべき重要なこと。そうされていることを、なぜ我々はfilterUserオブジェクト値の学生の上記のリスト、時間の出力が、それでもすべてのコンテンツの出力を修正しますか?ここでは、以下の修正方法を与えるfilterUserを見て:


private static void filterUser(List<Student> students){
    students.removeIf(user -> user.getScore() < 60);
    students.forEach(student -> student.setStar(student.getStar()+1));
}

出力:

student5|60|1
student6|61|1
student7|62|1
student8|63|1
student9|64|1

ああ、この時間は最終的に私たちが望む結果です。量は、次の2行のコードの差の下側及び上側filterUser方法の比較:

students = students.stream().filter(student -> student.getScore() >= 60).collect(Collectors.toList());
students.removeIf(user -> user.getScore() < 60);

ああ、そして作家を行い、それを考える、ハハ、右、私たちは、生徒への割り当てを持っていて、値が彼の元のオブジェクトに割り当てられている場合、実際には問題ありませんが、あなたは新しいオブジェクトから新しい割り当ての学生を取る場合その後再びfilterUser方法の学生は、元の主な方法学生に操作オブジェクトに影響を与えることができません。

あなたの同等は友人刻まれたキーの友人にそれを与えたマスターである、いじくりお部屋を開くことができないので、他の人逝ってしまっを開いた後、部屋に彼の鍵を置きます。そして、私たちの第一の方法ラムダ式Collectors.toList()新しいリスト(新しい部屋アウトすなわち、アウト)から新しいフレーズです。


/**
 * Returns a {@code Collector} that accumulates the input elements into a
 * new {@code List}. There are no guarantees on the type, mutability,
 * serializability, or thread-safety of the {@code List} returned; if more
 * control over the returned {@code List} is required, use {@link #toCollection(Supplier)}.
 *
 * @param <T> the type of the input elements
 * @return a {@code Collector} which collects all the input elements into a
 * {@code List}, in encounter order
 */
public static <T>
Collector<T, ?, List<T>> toList() {
    return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                               (left, right) -> { left.addAll(right); return left; },
                               CH_ID);
}

ああ、9〜私は最終的な出力がstudent0なるかまたは、なぜ知っているので、出力出ています。しかし、問題を再度、上記の新しい新しいオブジェクトを与えることであると述べ、なぜstudent0〜4が0で開始し、student5〜9は、それの一つとなっている、これは値がないか、またはオブジェクトを変更しますまだ、鍵は今だけ開いていることをさらに別の部屋、オリジナルのものに部屋がどのように変化するかを避けます。

ああ、実際には、そこの理由はほとんどの学生がリストに対応するということですが、リストはオブジェクトの学生で保たれています。私たちのアナロジーは最初の部屋は、変換フィルタから抜け出すためにため、2番目の部屋は(別の次元があるかもしれないが、実際には、最初の部屋は、部屋に10人を開くために使用される10個のキーが存在する、あります世界、ハハ)、セカンドルームキーのみ5〜9部屋、この部屋を開くために5人の学生。そして今、あなたの友人は、対応する学生の部屋を開ける5キーを、取った、小さな星に入れました。あなたが部屋に10人の10を開くための鍵を取ったときに、自然に彼らは部屋に5人の以上の学生リトルスターの友人を見つけました。

それでは、なぜ最初filterUser出力方法の結果は、10人の学生を含み、そしてstudent0〜4を起動する0で、かつstudent5〜9 1、それ明らかになりました。

限り、私たちは覚えているとして、Javaで渡す方法パラメータは、ラインに渡される唯一の値です。である何より、実際には、限り、我々はそれが値渡しされるよう、Javaオブジェクトとオブジェクト参照の格納方法を明確にするかが重要なのではない参照を渡すよう。しかし、本当に重要なのは、時間の顔の質問を行います。

それは参照によって渡された言語をサポートしているとのことを言って、あなたはルの例を与えることができ、今Javaが唯一の値によって渡されることなので、参照を渡し、それが点灯し、ここでのC ++の例を取ります:

#include <stdio.h>
void swap1(int* a,int* b);
void swap2(int& a,int& b);
void swap3(int* a,int* b);

void main(){
    printf("Hello World!\n");
    int a = 3;
    int b = 4;
    printf("bef swap, add of a = %d\n",&a);
    printf("aft swap, val of a = %d\n",a);
    //swap(a,b);
    //swap1(&a,&b);
    swap2(a,b);
    //swap3(&a,&b);
    
    printf("aft swap, add of a = %d\n",&a);
    printf("aft swap, val of a = %d\n",a);
}
// pass by value
void swap(int a,int b){
    int temp = a;
    a = b;
    b = temp;
}
// pass by address
void swap1(int* a,int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
// pass by reference
void swap2(int& a,int& b){
    int temp = a;
    a = b;
    b = temp;
}
// pass by value ?
void swap3(int* a,int *b){
    int* temp = a;
    a = b;
    b = temp;
}

異なる出力メソッドを呼び出します。

 swap2は〜参照の友人によって渡されます。次の小節をよく理解して組み合わせたいくつかの他の方法。

第もっと世間の注目を取得し、オーノー質問をすることができる公共の場での問題があります。

 

強い兄100100強制

百千百のプログラミング、インターネットと何も新たな洞察を強制しました

 

54元記事公開 ウォン称賛69 ビューに25万+を

おすすめ

転載: blog.csdn.net/seanxwq/article/details/97416255