いつもお世話になります。
ある書籍に『**(推奨しませんが)**状態を持つラムダ式を作りたい場合』という例で、
フィールドにラムダ式からアクセスする方法が載っていました。
さて、現在以下のようにオブジェクトのリストをArrayList<ArrayList<String>>になおす
処理を書いたのですが、これもあまりよろしくない作法の記述になるのでしょうか。
(書籍にあるようなラムダ式内からフィールド変数にアクセスしているので。)
java
1 2 private int cnt; //インスタンスフィールド。ラムダ式内でインクリメントさせる。 3 4 /** 5 * Functionオブジェクト. 6 * PersonをArrayListへ変換する 7 * @return 8 */ 9 private Function<Person, ArrayList<String>> convertToArray() { 10 return p -> { 11 ArrayList<String> list = new ArrayList<>(); 12 list.add(String.valueOf(cnt)); //←ここ!連番を入れたいので、インスタンスフィードを用いる 13 list.add(p.getName()); 14 list.add(String.valueOf(p.getAge())); 15 cnt++; //フィールドを変更 ←これがまずい? 16 return list; 17 }; 18 } 19 20 21 //Fuctionを用いた処理 22 public void hoge() { 23 24 Person p1 = new Person("taro", 5); 25 Person p2 = new Person("jiro", 10); 26 Person p3 = new Person("saburo", 15); 27 Person p4 = new Person("siro", 20); 28 29 List<Person> list = new ArrayList<>(); 30 list.add(p1); 31 list.add(p2); 32 list.add(p3); 33 list.add(p4); 34 35 //実際にリストのstream処理で上記のFunctionを用いて変換する 36 list.stream().map(convertToArray()).forEach(System.out::println); 37 38 } 39 40
結果
[0, taro, 5] [1, jiro, 10] [2, saburo, 15] [3, siro, 20]
期待通りの動きにはなるのですが、ただ推奨されない理由が気になってしまい・・。
ご教示よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/06/09 11:40
2017/06/09 14:22 編集
退会済みユーザー
2017/06/10 00:02