Javaでプログラミングする際、研修でも研修以外でも
List,Mapなどはよく(たまにSet,Iteratorなど)登場すると思います。
が、久しぶりに変換するものは
「あれ?これどうやって変換するんだっけ」となることもあるはずなので
1.とりあえず早見表
クラス名があるものはstaticメソッド、メソッド名のみのものはインスタンスメソッド
|\変換先
変換元\|List・Setなど(Collection)|Map|Iterator|Stream|配列
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
List/Setなど
(Collection)|コンストラクタ|-|iterator()|stream()|toAttay()
Map|entrySet(), keySet(), values()|コンストラクタ|(Setを経由する)|(Setを経由する)|(Setを経由する)
Stream|Collect()|Collect()|iterator()|中間操作全般|toArray()
配列|(Listのみ)
Arrays.asList()※|-|(Listを経由する)|Steam.of()|Arrays.copyOfRange()
※java9以降はList.of(), Set.of()
2.大事なところだけ解説
・Collection(List/Setなど)→Collection(List/Setなど)
Javaの組み込みCollectionクラス(ArrayList,HashSet,ArrayDequeなど)は
コンストラクタにCollectionを入れるものがあります。
MapはCollectionではありませんが、Map→Mapも同様のことができます。
//Setを事前に用意する
Set<String> ESet = Set.of("list","set","deque");
//SetをListに!
List<String> EList = new ArrayList(Eset);
※null許容のクラス→不許容のクラスに変換する場合などは例外に注意!
・Map→Collection,Iterator
Key一覧だけほしい場合はkeySet,中身だけほしい場合はvalues()とします。
for文で両方使用する処理をしたい場合はentrySet()
//Mapを事前に用意する
Map<String,Collection<String>> EMap = new HashMap<>();
EMap.put("list",List.of("list"));
EMap.put("set",Set.of("set"));
//MapをSetに!
Set<String> ESet = EMap.keySet();
//SetをIteratorに!
ESet.iterator();
//つなげてMap→Iteratorも可
EMap.keySet().iterator();
・List→配列への変換
List<String> EList = List.of("list","set","deque");
String[] EArray = EList.toArray(new String[0]);
※引数に配列を入れないと Object[] になってしまうので注意!
3.やや時間のある人向け:特殊なCollectionに変換したい...Streamを使って変換
Streamからはcollect()を使用することでCollectionにすることができます。
(配列やMapなど、Collection以外にすることも可能)
特に、Collectors.toCollectionを利用することでほとんどあらゆるCollectionを簡単に作成できます。
・組込Collectorを使った変換
List<String> EList = List.of("list","set","deque");
//Setに変換する
Set<String> ESet = EList.stream().collect(Collectors.toSet());
注意:Collectors.toSet(),Collectors.toList()は変更可能か不可能かも保証されていないので注意!
(例:toListは現状ArrayListだが、いきなり変更不可能なListにされる可能性あり)
List<Integer> EList = List.of(1,2,3);
//リストの要素をkeyに、文字列化したものをvalueに設定するMapに変換する
Map<Integer,String> EMap = EList.stream().collect(Collectors.toMap(Function.identity(), String::valueOf));
・Collectors.toCollectionを使った変換
List<Integer> EList = List.of(1,2,3);
//Listの実装クラスを指定したい場合などは、toCollectionを使う
LinkedList<Integer> EList = EList.stream().collect(Collectors.toCollection(LinkedList::new));