こちらの記事はユアマイスターアドベントカレンダー2020の9日目の記事です
こんにちは!!!!
今回のテーマ
Javaで配列・Listの宣言方法からstreamAPIを使ってListの操作を行うまでの方法をまとめます。
なぜこのテーマにしたのか
- Javaを書いている時に個人的によく使う&使いやすいものがStreamAPIなので
- 最近Java書いてないから忘れてきたので勉強し直すことが目的
配列の宣言・初期化・データの取得方法
方法1
String prefectures[] = new String[2]; // 変数の宣言&要素数の設定をする
prefectures[0] = "東京"; // index = 0番目に東京がはいる
prefectures[1] = "神奈川"; // index = 1番目に神奈川がはいる
prefectures[2] = "沖縄"; // ArrayIndexOutOfBoundsException
String tokyo = prefectures[0]; // index = 0番目を取得
System.out.println(tokyo); // 東京
// 方法2
String prefectures[] = {"東京", "神奈川"}; // 初期化
prefectures[2] = "沖縄"; // ArrayIndexOutOfBoundsException
String tokyo = prefectures[0]; // index = 0番目を取得
System.out.println(tokyo); // 東京
配列は宣言時に要素数が決まるので増やすも減らすもできません。
存在しない要素にアクセスした場合は ArrayIndexOutOfBoundsException
が起きます。
Listの宣言・初期化・データの取得方法
// 宣言
ArrayList<String> members = new ArrayList<String>();
// データの追加→取得方法その1
members.add(0, "田中"); // 第一引数→index, 第二引数→入れたいデータ
String tanaka = members.get(0); // index = 0番目を取得
System.out.println(tanaka); // 田中
// データの追加→取得方法その2
members.add("岡田"); // 勝手にindex=1で追加される
String okada = members.get(1); // index = 1番目を取得
System.out.println(okada); // 岡田
members.add(5,"山田"); // IndexOutOfBoundsException
Listはデータを増やすも減らすも自由ですが、index数を順番通りに入れないと例外が起きます。
ArrayList<String> members = new ArrayList<>();
ちなみに宣言時の二個目のダイヤモンド演算子は省略可能です↑
StreamAPIを使ったListの処理
filter
ユースケース:特定のデータのみListからFilterかけたい時
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumber = numbers.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
// 偶数のみListで取得し直す
System.out.println(evenNumber); // [2, 4, 6]
map
ユースケース:要素全てに同じ操作を行いたいとき
public void numbersTwiceExecute(){
List<Integer> numbers = Arrays.asList(1, 2, 3);
List<Integer> twiceNumbers = numbers.stream().map(this::twiceNumber).collect(Collectors.toList());
// Listの中身全てを2倍にした
System.out.println(twiceNumbers); // [2, 4, 6]
}
public Integer twiceNumber(Integer number){
return number * 2;
}
sorted
ユースケース:並び替えしたい時
事前にこちらのクラスを実装してください↓
public class User {
int age;
String name;
public User(int age, String name){
this.age = age;
this.fullname = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setFullname(String name) {
this.name = name;
}
}
public void sortedByAge(){
User user1 = new User(20,"山田花子");
User user2 = new User(10,"小野ヨーコ");
User user3 = new User(5,"田中愛");
List<User> users = Arrays.asList(user1, user2, user3);
users.forEach(user-> System.out.print(user.getAge() + "才 "));
// 20才 10才 5才
List<User> sortedByAgeUsers = users.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
sortedByAgeUsers.forEach(user -> System.out.print(user.getAge() + "才 "));
// 5才 10才 20才
// 年齢順にソートされました
}
anyMatch
ユースケース:リストに特定のデータを含んでいるか確認したい時
List<Integer> numbers = Arrays.asList(1, 2, 3);
boolean existOddNumber = numbers.stream().anyMatch(num -> num % 2 == 1);
// Listに奇数が含まれているかの確認
System.out.println(existOddNumber); // true
感想
StreamのおかげでListの処理はだいぶ楽&可読性が上がると思いました。
これからも積極的に使っていきたいです。