Javaのコレクション周りの備忘録
目次
Collections API
- Java8から使える
List
動的配列
// Listの初期化 List<Integer> list = new ArrayList<>(); // Java 7以降 // 値の追加 list.add(1); list.add(2); // indexに対応する要素の取得 list.get(0); list.remove(1); // 1番目の要素を削除
Listの初期化パターン
// 固定リストとして初期化 List<String> list = Arrays.asList("Apple", "Banana", "Orange"); // 可変リストとして初期化 List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Orange")); // staticイニシャライザを用いる List<String> list = new ArrayList<>() { { add("Apple"); add("Banana"); } }
Map
Map<String, Integer> map = new HashMap<>(); map.put("banana", 100); map.put("apple", 200); map.put("orange", 300); Set<String> set = new HashSet<>(); set.add("fruits"); set.add("rice"); set.add("meet"); set.add("vegetable");
Stream API
特徴
- 関数型言語っぽく記述できる
map
List<Integer> list = Arrays.asList(1,2,3,4,5); List<Integer> expon = list.map(i -> Math.exp(i)).collect(Collectors.toList());
filter
List<Integer> list = Arrays.asList(1,2,3,4,5); List<Integer> oddNumbers = list.stream().filter(i -> i % 2 != 0).collect(Collectors.toList());
グループ化して処理する
class Food { private String name; private String category; private Integer price; public Food(String name, String category, Integer price) { this.name = name; this.category = category; this.price = price; } public String getCategory() { return this.category; } public Integer getPrice() { return this.price; } } List<Food> foods = new ArrayList<>(); foods.add(new Food("りんご", "フルーツ", 100)); foods.add(new Food("ばなな", "フルーツ", 50)); foods.add(new Food("白米", "炭水化物", 50)); foods.add(new Food("餅", "炭水化物", 200)); foods.add(new Food("鱈", "魚", 300)); foods.add(new Food("鮭", "魚", 300)); foods.add(new Food("牛肉", "肉", 400)); foods.add(new Food("豚肉", "肉", 300)); // カテゴリごとに集計する Map<String, Integer> aggregated = foods.stream().collect( Collectors.groupingBy( Food::getCategory, Collectors.summingInt(Food::getPrice) ) ); aggregated.forEach((category, subtotal) -> { System.out.println(category + " => " + subtotal); // フルーツ => 150... });