JavaRush /Java Blog /Random-JA /ラムダとストリーム、実践のみで理論はありません

ラムダとストリーム、実践のみで理論はありません

Random-JA グループに公開済み
こんにちは、みんな。コンテストを機に、ここに記事ではなく、短いレッスンを書くことにしました。Java のラムダとストリームについて説明します。すでに慣れていて使用している場合は、この記事の最後までスキップしてください。練習できる JavaRush を使用したタスクがいくつか選択されています。Java 8 以降、JR からのトレーニングが必要です。詳細はほとんどなく、理解できないことも多く、それを理解したいという強い欲求があります。まず、ラムダとストリームの出現の歴史については説明しません。私自身が知らないだけです。私が知っているのは、それらが関数型プログラミング スタイルから OOP スタイルに来たということだけです。私の短い学習経験では、何をどのように行うかを示しただけですが、人によってはアイデアを理解するのが難しいと感じる場合もあります。書き方を覚えておいてください。後で理解できます。

ラムダ

ラムダとストリーム、実践のみ、理論なし - 1ラムダとストリーム、実践のみ、理論なし - 2ラムダが何なのかまったくわからない場合は、 ラムダは次のようになります。
(a, b) -> a.compareTo(b)
(переменные) -> действие
今のところはそれで十分です。理論はリンク 1リンク 2で読むことができますが、実践する方がはるかに楽しいと思います。次の問題を解決することをお勧めします: 方法 1 を使用して計算機を作成します。このメソッドは 2 つのデジタル値とその他のものを受け入れる必要があります。コードは次のようになります。
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
メソッド シグネチャに 3 つのパラメータを入力しcalculate、 に 1 つのコマンドを追加してreturn、 でこのメソッドの呼び出しをテストする必要がありますmainこのメソッドで何ができるようになるのでしょうか?
  • 折り畳み;
  • かける;
  • 分ける;
  • 差し引く。
  • ルートを計算します。
  • 累乗します。
  • 引数の合計を最初の数値 + 117 で割った値をべき乗します。
  • およびその他の考えられるすべての操作。
使用してはいけないもの:
  • if-else;
  • char動作指標として。
  • switch-case;
  • その他、頭に浮かぶすべてのこと。
使用できるもの:
  • ラムダのみ、タスクはラムダにあります。
- 何?それで全部?- はい、それだけです。文字通り 3 行追加する必要があるため、少なくとも 1 行を提案すれば、残りは自動的に書き込まれます。必要に応じて、Google で例を検索して理解することもできます。もちろん、自分自身でチェックしますし、不正行為をしても誰も知りませんが、ではなぜでしょうか? このような単純な問題を解決したことで、私の 1.5 年生の生徒は全員、ラムダとは何か、そしてその使用方法について大まかな理解を得ることができました。これはストリーミングには非常に必要です。結果を自慢したり、正しく実行できたかどうかを知りたい場合は、プライベート メッセージでコードを送信してください。コメントする必要はありません。興味深いヒントをそこに追加できます (ただし、タスクが簡単になりすぎないように注意してください)。繰り返しますが、この例を解決すると、ラムダの使用方法についてはすでに大まかに理解できるはずです。
ラムダとストリーム、実践のみ、理論なし - 3
次に、Java ストリームに移りましょう。これらは、読者であるあなたが考えているかもしれないストリームではありません。いいえ、そうinputStreamではありませんOutputStream。それは違う、もっと面白い。ストリームは完全ではありませんが、サイクルに取って代わりました。彼らは「やり方を説明するのではなく、何をすべきかを説明する」というモットーでサービスを受けています。ストリームの小さな例:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
何が起きてる?コメントを追加しましょう:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
通常のループと比較します。
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
コードを読むとすべてが怖く見えますが、コメントがあると簡単ですか? これは普通のことですが、私も長い間理解できませんでした。理解の鍵は実践です。したがって、私たちはサードパーティの記事を読み、質問に対する答えを探し始めます。ここのコメントで質問することもできます。完全な答えはしませんが、方向性は示します。 ストリーミングの練習に最適だと思われる JavaRush のタスクのリスト:
  • 2208 - 1 つのストリームと 1 つのリターンで解決できます。つまり、メソッドの本体は で始まりreturn、その後に 1 つのストリーム全体が存在します。要件を省略しましょうStringBuilder

  • 1908 - 1 ストリームと 1 リターンで解くこともできます。ファイルの読み取りから始まります。(可能であれば) ストリーム経由でファイルに記録する方法がわかりません。今のところ手動で行っています。それらの。2 つのストリーム (コンソールとファイルへの書き込み) のみを開きます。シートまたはストリーム (google および javadoc) を返すメソッドを通じてファイルを読み取ります。

  • 1907 - 理論的には、これも 1 つのストリームで解決できます。ストリームへの入力はファイル名で、出力はワード数です。

それだけです。できれば、また簡単な話を書きます。私の意見では、何か素晴らしいものについて、それを試す機会なしに読むのは、なんとなく退屈というか、何かです。計算機と 3 つのパズルを終えたら、ラムダとストリームについてはすでに十分に理解していると思います。まだ読んでいない場合は、すべての可能性について読んでください。更新:
  • 1016 - 少しひねった方法で、1 つのストリームと 1 つのリターンで解決できます。

  • 1821 - 非常に簡単で、1 ストリームと 1 リターンです。

    これら 2 つのタスクでは、別のストリーミング方法と別のコレクターを紹介します。

  • 1925 - 1 つのストリームで単語を含む行を取得し、それをファイルに書き込むことができます (ストリームからファイルに書き込むことができるかどうかはわかりません)

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION