#概要
StreamAPIを使って、csv出力をした時のメモ
・ヘッダー項目からMapにアクセスして出力データを取得する、必ず値が存在するわけではない
・ヘッダー項目を定数定義により可変にしている
#実装
変数定義とか
java
List<Map<String, String>> items = new ArrayList<>();
String[] header = {"福岡", "佐賀", "長崎", "熊本", "大分", "宮崎", "鹿児島"};
データ
Map<String, String> item1 = new HashMap<>();
item1.put("福岡", "100");
item1.put("佐賀", "200");
item1.put("長崎", "300");
item1.put("大分", "10");
item1.put("宮崎", "20");
item1.put("鹿児島", "30");
item1.put("熊本", "40");
item1.put("沖縄", "70");
items.add(item1);
Map<String, String> item2 = new HashMap<>();
item2.put("佐賀", "800000");
item2.put("大分", "1200000");
item2.put("宮崎", "1100000");
item2.put("熊本", "1800000");
item2.put("福岡", "5000000");
item2.put("長崎", "1400000");
item2.put("鹿児島", "1700000");
item2.put("沖縄", "1400000");
items.add(item2);
Map<String, String> item3 = new HashMap<>();
item3.put("鹿児島", "かごしま");
item3.put("長崎", "ながさき");
item3.put("福岡", "ふくおか");
item3.put("宮崎", "みやざき");
item3.put("佐賀", "さが");
item3.put("沖縄", "おきなわ");
items.add(item3);
出力時
java
File file = new File("d:/test.csv");
try (PrintWriter writer = new PrintWriter(file)) {
// ヘッダ出力
writer.println(Arrays.stream(header).collect(Collectors.joining(",")));
// データ出力
for (Map<String, String> item : items) {
writer.println(Arrays.stream(header)
.map(m -> Optional.ofNullable(item.get(m)).orElse(""))
.collect(Collectors.joining(",")));
}
writer.flush();
}
出力結果
test.csv
福岡,佐賀,長崎,熊本,大分,宮崎,鹿児島
100,200,300,40,10,20,30
5000000,800000,1400000,1800000,1200000,1100000,1700000
ふくおか,さが,ながさき,,,みやざき,かごしま
#ポイント
.mapでOptionalを使い、値が存在しない時に空文字を出力するようにする。
Optional.ofNullable(item.get(m)) → nullを許容するOptionalを生成する。
.orElse("") → nullの場合に空文字を返すようにする。
あとは通常通り、.collect(Collectors.joining(","))でカンマ区切りに連結する。