さらに高度なユーティリティ関数を作ってみましょう。ここでは 「特定の条件でグループ化」「Mapに変換」「nullや空文字を除外」 をテーマにしたバージョンを紹介します。
① 特定の条件でグループ化するバージョン
例えば「文字列の先頭文字ごとにグループ化」するような関数です。
import java.util.*;
import java.util.stream.Collectors;
public class ListUtils {
@SafeVarargs
public static <T, K> Map<K, List<T>> groupBy(
java.util.function.Function<T, K> classifier,
List<T>... lists
) {
return Arrays.stream(lists)
.filter(Objects::nonNull)
.flatMap(List::stream)
.collect(Collectors.groupingBy(classifier));
}
}
Java使用例
List<String> list1 = Arrays.asList("Apple", "Banana", "Avocado");
List<String> list2 = Arrays.asList("Blueberry", "Cherry");
Map<Character, List<String>> grouped = ListUtils.groupBy(s -> s.charAt(0), list1, list2);
System.out.println(grouped);
// {A=[Apple, Avocado], B=[Banana, Blueberry], C=[Cherry]}
Java② Mapに変換するバージョン
例えば「文字列をキー、長さを値」に変換する関数です。
import java.util.*;
import java.util.stream.Collectors;
public class ListUtils {
@SafeVarargs
public static <T, K, V> Map<K, V> toMap(
java.util.function.Function<T, K> keyMapper,
java.util.function.Function<T, V> valueMapper,
List<T>... lists
) {
return Arrays.stream(lists)
.filter(Objects::nonNull)
.flatMap(List::stream)
.collect(Collectors.toMap(keyMapper, valueMapper, (v1, v2) -> v1));
}
}
Java使用例
List<String> list1 = Arrays.asList("Apple", "Banana");
List<String> list2 = Arrays.asList("Cherry");
Map<String, Integer> map = ListUtils.toMap(s -> s, s -> s.length(), list1, list2);
System.out.println(map);
// {Apple=5, Banana=6, Cherry=6}
Java③ nullや空文字を除外するバージョン
import java.util.*;
public class ListUtils {
@SafeVarargs
public static List<String> mergeExcludeNullOrEmpty(List<String>... lists) {
List<String> result = new ArrayList<>();
for (List<String> list : lists) {
if (list != null) {
for (String item : list) {
if (item != null && !item.isEmpty()) {
result.add(item);
}
}
}
}
return result;
}
}
Java使用例
List<String> list1 = Arrays.asList("Apple", "", null);
List<String> list2 = Arrays.asList("Banana", "Cherry");
List<String> merged = ListUtils.mergeExcludeNullOrEmpty(list1, list2);
System.out.println(merged); // [Apple, Banana, Cherry]
Java💡 まとめ
- グループ化 →
groupByを使って条件ごとにまとめる - Map変換 →
toMapでキーと値を自由に設定 - null/空文字除外 → フィルタを入れて安全に連結
👉 これらを組み合わせれば「条件付きでグループ化しつつ、重複を除外」「Mapに変換しながらフィルタ」など、柔軟なデータ処理が可能になります。
