こちらが、柔軟な連結処理ができるユーティリティ関数のバリエーションです。目的に応じて使い分けられるように設計しています。
① 順番はそのままで、重複だけ除く
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class ListUtils {
@SafeVarargs
public static <T> List<T> mergePreserveOrderNoDuplicates(List<T>... lists) {
Set<T> seen = new LinkedHashSet<>();
for (List<T> list : lists) {
if (list != null) {
for (T item : list) {
seen.add(item); // LinkedHashSet keeps insertion order
}
}
}
return new ArrayList<>(seen);
}
}
Java特徴
- 順番はそのまま(最初に出てきた順)
- 重複は除去(後から出てきた同じ要素は無視)
② 順番も中身もカスタムで処理(フィルター・変換付き)
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
public class ListUtils {
@SafeVarargs
public static <T, R> List<R> mergeCustom(
Function<T, R> transformer,
Predicate<T> filter,
List<T>... lists
) {
List<R> result = new ArrayList<>();
for (List<T> list : lists) {
if (list != null) {
for (T item : list) {
if (filter.test(item)) {
result.add(transformer.apply(item));
}
}
}
}
return result;
}
}
Java特徴
filterで条件に合うものだけを残す(例:null除去、特定文字列だけ)transformerで要素を変換(例:大文字化、数値変換など)- 順番は処理された順に従う
使用例(カスタム処理)
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list1 = Arrays.asList("apple", "banana", null);
List<String> list2 = Arrays.asList("banana", "cherry");
// nullを除去し、大文字に変換
List<String> result = ListUtils.mergeCustom(
s -> s.toUpperCase(), // 変換処理
s -> s != null, // フィルター条件
list1, list2
);
System.out.println(result); // [APPLE, BANANA, CHERRY]
}
}
Java応用アイデア
- 重複除去付きのカスタム処理 →
Set<R>を使えばOK - ソート付き →
Collections.sort(result)を追加 - 逆順で処理したい →
for (int i = lists.length - 1; i >= 0; i--)に変更
