反射するのではなく、関数型プログラミングを使用します

特定のシナリオでは、代替的な関数型プログラミング反射の使用は、コードは、効率的なコードを簡素化することができます。

シーン内の前の仕事の経験、不定長の配列は、いくつかのフィールドの値を順次オブジェクトに割り当てられる必要があります。その時点で、溶液は、その後、機能プログラミングのより深い理解のために、リフレクションを使用することで、代わりに反映させることができます。

反射器はバイトコードを解析する必要があり、効率が高くない、例外対象を処理する必要があり、より多くのコード。私たちは、関数型プログラミングを使用することをお勧めします。

次のようにテストコードがあります:

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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/blouson/p/11258770.html