特定のシナリオでは、代替的な関数型プログラミング反射の使用は、コードは、効率的なコードを簡素化することができます。
シーン内の前の仕事の経験、不定長の配列は、いくつかのフィールドの値を順次オブジェクトに割り当てられる必要があります。その時点で、溶液は、その後、機能プログラミングのより深い理解のために、リフレクションを使用することで、代わりに反映させることができます。
反射器はバイトコードを解析する必要があり、効率が高くない、例外対象を処理する必要があり、より多くのコード。私たちは、関数型プログラミングを使用することをお勧めします。
次のようにテストコードがあります:
1つの パッケージのデモ。 2 3 インポートにjava.lang.reflect.InvocationTargetException。 4 インポートjava.lang.reflect.Methodオブジェクト。 5 輸入java.util.Arrays。 6 インポートjava.util.Listに。 7 インポートjava.util.function.BiConsumer。 8 インポートjava.util.stream.IntStream。 9 10 パブリック クラスTEST01 { 11 12 静的文字列[] ARR = { "str01"、 "str02"、 "str03"、 "str04"、 "str05"、 "str06"、 "str07"、 "str08"、 "str09" 、 "STR10" }。 一覧<BiConsumer <項目、文字列>> biConsumers = は、Arrays.asList(項目:: setVar1、アイテム:: setVar2、アイテム:: setVar3、 15 項目:: setVar4、アイテム:: setVar5、アイテム:: setVar6、アイテム:: setVar7 、アイテム:: setVar8、アイテム:: setVar9、アイテム:: setVar10)。 16 17 公共 静的 ボイドメイン(文字列[]引数){ 18 長い開始= にSystem.currentTimeMillis(); 19 IntStream.range(0、10000).forEach(I - > testReflect()); 20 長い端= にSystem.currentTimeMillis(); 21 のSystem.out.println(終了- 開始)。 22 23 長い START1 =System.currentTimeMillis(); 24 IntStream.range(0、10000).forEach(I - > testMethodReference()); 25 長い END1 = にSystem.currentTimeMillis(); 26 27 のSystem.out.println(END1 - START1)。 28 } 29 30 静的 ボイドtestReflect(){ 31 商品アイテム= 新しいアイテム()。 32 33 のtry { 34 クラスclazz = Class.forNameの( "demo.Item" <?> )。 35 のためには、(int型、iはarr.length < - 1; i = 0 iは++ ){ 36 メソッドのメソッド= clazz.getMethod( "SETVAR" +(I + 1)、文字列。クラス)。 37 method.invoke(項目、ARR [0 ])。 38 } 39 40 } キャッチ(ClassNotFoundExceptionが|ないNoSuchMethodException |にSecurityException | IllegalAccessExceptionが 41 |はIllegalArgumentException | にInvocationTargetException電子){ 42 e.printStackTrace(); 43 } 44 } 45 46 静的 ボイドtestMethodReference(){ 47 商品アイテム= 新しいアイテム()。 48 49 のために(int型 ; I <arr.length I ++は、I = 0 ){ 50 biConsumers.get(I).accept(項目、ARR [I])。 51 } 52 } 53 }
簡単なベンチマーク結果:速度の10倍の差
1つの パッケージのデモ。 2 3 パブリック クラスアイテム{ 4 プライベート文字列VAR1。 5 プライベート文字列のVAR2。 6 プライベート文字列VAR3。 7 プライベート文字列のVAR4。 8 プライベート文字列のVAR5。 9 プライベート文字列のvar6。 10 プライベート文字列のvar7。 11 プライベート文字列がvar8。 12 プライベート文字列のvar9。 13 プライベート文字列のvar10。 14 15 公共ストリングgetVar1(){ 16 リターンによってVAR1; 17 } 18 19 公共 ボイドsetVar1(VAR1に文字列){ 20 この VAR1 = VAR1。 21 } 22 23 公衆getVar2(){文字列 24 の戻りによってVAR2。 25 } 26 27 公共 ボイドsetVar2(VAR2に文字列){ 28 この VAR2 = VAR2。 29 } 30 31 公衆getVar3(){文字列 32 の戻りによってVAR3。 33 } 34 35 公共 ボイドsetVar3(VAR3に文字列){ 36 この VAR3 = VAR3。 37 } 38 39 公衆getVar4(){文字列 40 の戻りによってVAR4。 41 } 42 43 公共 ボイドsetVar4(VAR4に文字列){ 44 この VAR4 = VAR4。 45 } 46 47 公衆getVar5(){文字列 48 の戻りによってVAR5。 49 } 50 51 公共 のボイドsetVar5(VAR5に文字列){ 52 この VAR5 = VAR5。 53 } 54 55 公衆getVar6(){文字列 56 の戻りによってvar6。 57 } 58 59 公共 ボイドsetVar6(var6に文字列){ 60 この var6 = var6。 61 } 62 63 公衆getVar7(){文字列 64 の戻りによってvar7。 65オーバー } 66 67 公共 ボイドsetVar7(var7に文字列){ 68 この var7 =var7; 69 } 70 71 公衆getVar8(){文字列 72 の戻りによってがvar8。 73 } 74 75 公共 ボイドsetVar8(がvar8に文字列){ 76 本がvar8 = がvar8。 77 } 78 79 公衆getVar9(){文字列 80 の戻りによってvar9。 81 } 82 83 公共 ボイドsetVar9(var9に文字列){ 84 この var9 = var9。 85 } 86 87 公共getVar10に文字列(){ 88 リターンによってvar10。 89 } 90 91 公共 ボイドsetVar10(var10に文字列){ 92 この var10 = var10。 93 } 94 }