Java | 複数の ArrayList をまとめて1つのリストに連結するユーティリティ関数

Java Java
スポンサーリンク

こちらが、柔軟な連結処理ができるユーティリティ関数のバリエーションです。目的に応じて使い分けられるように設計しています。


① 順番はそのままで、重複だけ除く

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--) に変更
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました