リストを使うかマップを使うかという問題もあるが、いちばんは一度格納したBeanのフィールドにアクセスし、変更が可能かを知りたいです。
ArrayList
やMap
、HashMap
などのコンテナクラスでは、要素を取り出したいときに使うメソッドはそれぞれ違います。ArrayList
に限って言えば
ArrayList#get
やArrayList#indexOf
などで取り出すことになるでしょう。いずれにせよ(格納の仕方にもよるでしょうが)コンテナに入れるものがクラスのインスタンスならば、その参照がコンテナに入ってることになるので、それを取り出して変更などの操作をすれば、リスト中の要素(インスタンス)にも影響を及ぼします。つまり「変更は可能」です。以下は簡単なサンプルコードです。ご提示のコードがArrayList
で扱っているのでサンプルでもそれを使っていますが、それが本当に適切かどうかは質問者さんご自身でご検討ください。
Java
1/* t1.java */
2import java.util.ArrayList;
3
4class Food {
5 private String name = null;
6 private int priceNum = 0;
7 private int orderNum = 0;
8
9 public void setName(String name) { this.name = name; }
10 public String getName() { return name; }
11
12 public void setPriceNum(int num) { this.priceNum = num; }
13 public int getPriceNum() { return this.priceNum; }
14
15 public void setOrderNum(int num) { this.orderNum = num; }
16 public int getOrderNum() { return this.orderNum; }
17}
18
19public class t1 {
20 public static void main(String args[]) {
21 System.out.println("t1.main");
22
23 Food food3 = null;
24
25 ArrayList<Food> list = new ArrayList<Food>();
26 for (int i = 1; i <= 4; i++) {
27 Food food = new Food();
28 food.setName(String.format("name%02d", i));
29 food.setPriceNum(i * 10);
30 food.setOrderNum(i * 100);
31 list.add(food);
32
33 // 3つ目を別に保存しておいてみる
34 if (i == 3) {
35 food3 = food;
36 }
37 }
38
39 // 現在のリストの内容
40 dump(list);
41
42 int index = list.indexOf(food3);
43 //
44 // インデックスは2のはず list[2]
45 assert index == 2;
46
47 Food foodRef = list.get(index);
48
49 // 同じインスタンスのはず
50 assert foodRef == list.get(index);
51
52 // foodRef(=list[2])に新しい値をセットする。
53 food3.setName("NewNameFor#3");
54 food3.setPriceNum(333);
55 food3.setOrderNum(3333);
56
57 // 修正後のリストの内容を表示
58 dump(list);
59 }
60
61 private static void dump(ArrayList<Food> list) {
62 System.out.println("--------");
63 for (Food food: list) {
64 String message = String.format("Food: name=%s, priceNum=%d, orderNum=%d",
65 food.getName(), food.getPriceNum(), food.getOrderNum());
66 System.out.println(message);
67 }
68 }
69}
70
上記コードの実行結果です。リスト中のlist[2]
のインスタンスに影響があるのが分かります。尚、java
コマンド実行時に"-ea"オプションを付け、コード中のassert
診断が有効になるようにしています。
CMD
1C>javac t1.java
2
3C>java -version
4java version "1.8.0_162"
5Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
6Java HotSpot(TM) Client VM (build 25.162-b12, mixed mode, sharing)
7
8C>java -ea t1
9start t1.main
10--------
11Food: name=name01, priceNum=10, orderNum=100
12Food: name=name02, priceNum=20, orderNum=200
13Food: name=name03, priceNum=30, orderNum=300
14Food: name=name04, priceNum=40, orderNum=400
15--------
16Food: name=name01, priceNum=10, orderNum=100
17Food: name=name02, priceNum=20, orderNum=200
18Food: name=NewNameFor#3, priceNum=333, orderNum=3333
19Food: name=name04, priceNum=40, orderNum=400
20
21C>
追記しました: 2019-12-12 14:46
ArrayList
の場合、リスト中のインスタンスを検索する時にループなどでArrayList#get
で要素を逐一見ていく必要があるかもしれません。Stream APIを使うとよりスマートなコードとなる場合もあります。
Java
1import java.util.List;
2import java.util.ArrayList;
3import java.util.stream.Collectors;
4
5...省略
6
7// Stream APIを使って指定の要素(例:nameフィールドが"name04")のインスタンスを取得
8List<Food> foods = list.stream().filter(elem -> elem.getName().equals("name04")).collect(Collectors.toList());
9if (foods.size() == 1) {
10 Food target = foods.get(0);
11 target.setName("NewNameFor#4");
12 target.setPriceNum(444);
13 target.setOrderNum(4444);
14}