こんにちは、みんな。コンテストを機に、ここに記事ではなく、短いレッスンを書くことにしました。Java のラムダとストリームについて説明します。すでに慣れていて使用している場合は、この記事の最後までスキップしてください。練習できる JavaRush を使用したタスクがいくつか選択されています。Java 8 以降、JR からのトレーニングが必要です。詳細はほとんどなく、理解できないことも多く、それを理解したいという強い欲求があります。まず、ラムダとストリームの出現の歴史については説明しません。私自身が知らないだけです。私が知っているのは、それらが関数型プログラミング スタイルから OOP スタイルに来たということだけです。私の短い学習経験では、何をどのように行うかを示しただけですが、人によってはアイデアを理解するのが難しいと感じる場合もあります。書き方を覚えておいてください。後で理解できます。
次に、Java ストリームに移りましょう。これらは、読者であるあなたが考えているかもしれないストリームではありません。いいえ、そう
ラムダ
ラムダが何なのかまったくわからない場合は、 ラムダは次のようになります。(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
;- その他、頭に浮かぶすべてのこと。
- ラムダのみ、タスクはラムダにあります。
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 つのストリームで解決できます。ストリームへの入力はファイル名で、出力はワード数です。
-
1016 - 少しひねった方法で、1 つのストリームと 1 つのリターンで解決できます。
-
1821 - 非常に簡単で、1 ストリームと 1 リターンです。
これら 2 つのタスクでは、別のストリーミング方法と別のコレクターを紹介します。
-
1925 - 1 つのストリームで単語を含む行を取得し、それをファイルに書き込むことができます (ストリームからファイルに書き込むことができるかどうかはわかりません)
GO TO FULL VERSION