私は構文の部分を書きません。実際の質問を提起して、Java8のこれらの新しい機能がどのような便利さをもたらすことができるかを確認しましょう。
ちなみに、いくつかの一般的なプログラミングが使用されます、すべてがコードを簡素化することです
シーン:
従業員情報を記録するデータクラス
Public Class Employee {public String name;公共のint年齢;パブリックチャーセックス;パブリックストリング時間;公開給与;}このタイプのデータの列があります
list <employee> data = arrays.aslist(e1、e2、e3 ......)
今は必要です:グループ従業員の最初の名前の手紙で従業員の従業員(すべてが英語の名前であると仮定):
その後、私たちが取得したい結果はMap:char -> List<Employee>
public static Map <Character、list <employee >> groupByfirstchar(list <employee> data){map <character、list <employee >> result = new Hashmap <>(); for(従業員e:data){文字c = e.name.charat(0);リスト<Employee> l = result.get(c); if(l == null){l = new ArrayList <>(); result.put(c、l); } l.add(e); } return result;}コードは複雑ではなく、すぐに完了することができます。上司はあなたがとても効率的であると見ているので、彼はあなたがあなたの給料に従ってグループに分割すると言いました、5,000、5,000〜10,000など。
それはそれほど難しくありません、キーを変更して少し論理的に処理するだけです
public static Map <string、list <employee >> groupBysalary(list <employee> data){map <string、list <employee >> result = new Hashmap <>(); for(従業員e:data){string key = devery(e.salary); list <Employee> l = result.get(key); if(l == null){l = new ArrayList <>(); result.put(key、l); } l.add(e); } return result; <br>} private static string devery(int salary){if(salary <= 5000){return "5000"; } if(salary <= 10000){return "5000〜10000"; } if(salary <= 20000){return "10000〜20000"; }「20000以上」を返します}その後、上司は再び言った、従業員を雇用年に応じてグループに分割しましょう。 。 。
ここにコードは書きません。比較すると、どのようにグループ化しても、唯一の変更はキー値を選択する方法であることがわかります。
従業員の名前の最初の手紙は、初めてキーとして使用されます。
従業員e - > e.name.charat(0)
メソッド分離に従って、従業員の給与をキーとして文字列に変換する2回目:
従業員e - >個別(e.salary):文字列
等々
従業員e - > getyear(e.time):文字列
実際、最初の手紙を単一の方法に書き込むこともできます。
従業員e - > getFirstchar(e.name):文字
より美しく見えるためには、3つの方法のパラメーターが従業員に設定されていると言えます。メソッド本体は書かれていません。ここには、パラメーターと戻り値のみがリストされています。
従業員e - > getFirstchar(e):CharateRemployee e-> devery(e):stringemployee e-> getyear(e):string
- >の左側はパラメーター、右側は以下です。return値、 - >の右側はメソッドの署名です
次に、変更された部分をパラメーターとして抽出し、その他の変更されていない部分をメソッド本体として抽出することを自然に考えます。そのため、重複コードを省略できます。明らかに、変更された部分は上記の方法であり、従業員Eをキーに変換しますが、Javaはパラメーターとしてメソッドを渡すことができないことがわかっています。ただし、これは少しの経験を持つプログラマーにとって問題ではありません。インターフェイスを使用して目標を達成することができ、同時に別の問題に遭遇します。上記の3つの方法の返品値は異なるため、ジェネリックを使用する必要があります。
public static <k> map <k、list <employee >> groupbykey(list <employee> data、getKey <k> getKey){map <k、list <employee >> result = new hashmap <>(); for(従業員e:data){k key = getKey.getKey(e); list <Employee> l = result.get(key); if(l == null){l = new ArrayList <>(); result.put(key、l); } l.add(e); } return result;} interface getKey <k> {k getKey(Employee e);}次に、上記の最初の要件をこのように実現できます
map <character、list <employee >> result = groupbykey(data、new getKey <Character>(){@Override public Charatere getKey(Employee e){e.name.Charat(0);}});2番目の要件
map <string、list <employee >> result = groupbykey(list、new getKey <String>(){@Override public String getKey(Employee e){departer(e.salary);}});汎用パラメーターと匿名の内部クラスの実装のみを変更する必要があることがわかります。唯一の問題は、それがあまり現実的ではないことであり、多くの日常的なコードが匿名の内部クラスに特に反映されていることです。
実際、この匿名の内部クラスのパラメーターと戻り値のみを気にし、残りは単なる構文要件です。
Java8は、たまたま複雑なルーチンを避けるための良い方法を提供します。LambdaExpressions、上記の実装は
Map <文字、リスト<従業員>> resultByFirstchar = groupBykey(list、e - > e.name.charat(0)); map <string、list <employee >> resultbysalary = groupbykey(list、e-> departing(e.salary));
Lambda式は、私たちが気にするもの、パラメーター、返品値のみを示しています。同時に、タイプの推論により、パラメータータイプを省略できます。特定の構文はここには紹介されません。多くの情報がインターネットで見つけることができます
余分な:
ジェネリックを十分に理解している場合、メソッドグループビーキーをさらに抽出することができます。
public static <k、e> map <k、list <e >> groupby(list <?extends e> data、function <?super e、?extends k> fun){map <k、list <e >> result = new hashmap <>(); for(e e:data){k k = fun.apply(e); <br> list <e> l = result.get(k); if(l == null){l = new ArrayList <>(); result.put(k、l); } l.add(e); } return result; <br>}また、従業員のクラスも抽出しましたが、利点は明らかです
関数インターフェイスは、Java8に新しく追加されたインターフェイスです。
@functionalinterfacepublicインターフェイス関数<t、r> {r apply(t t);}Tタイプを入力して、Rタイプに戻ります。ジェネリックと機能プログラミングの組み合わせは非常に優れています。 Java8の新機能はさまざまな種類の苦情によって批判されていますが、メリットをもたらすことは常に良いことです。これにより、より多くの選択肢が得られます。
時間がある場合は、Java8のためのもう1つの素晴らしいツールであるStreamを紹介します
上記は、Java 8でのLambda式の適用と、編集者によって紹介された一般的な関連知識です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!