では、最後に 数値や文字列の複雑条件でもフィルタ可能な拡張版 を作ります。
これで「複数条件(AND/OR)」「範囲指定」なども簡単に連結時にフィルタできます。
1. 複雑条件対応ユーティリティ
import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Predicate;
public class ConcatUtilAdvanced {
// ----------------------------
// 配列版(複雑条件対応)
// ----------------------------
@SafeVarargs
public static <T> T[] concatAllFiltered(Predicate<T> condition, T[]... arrays) {
ArrayList<T> temp = new ArrayList<>();
for(T[] arr : arrays) {
for(T element : arr) {
if(condition.test(element)) temp.add(element);
}
}
if(arrays.length == 0) return null;
@SuppressWarnings("unchecked")
T[] result = Arrays.copyOf(arrays[0], temp.size());
for(int i = 0; i < temp.size(); i++) result[i] = temp.get(i);
return result;
}
// ----------------------------
// ArrayList版(複雑条件対応)
// ----------------------------
@SafeVarargs
public static <T> ArrayList<T> concatAllFiltered(Predicate<T> condition, ArrayList<T>... lists) {
ArrayList<T> result = new ArrayList<>();
for(ArrayList<T> list : lists) {
for(T element : list) {
if(condition.test(element)) result.add(element);
}
}
return result;
}
// ----------------------------
// 使用例
// ----------------------------
public static void main(String[] args) {
// 配列の例(文字列)
String[] classA = {"田中", "佐藤", "鈴木"};
String[] classB = {"高橋", "伊藤", "田村"};
String[] classC = {"山田", "中田"};
// 「名前に田が含まれる AND 名前が3文字以上」の人だけ連結
String[] filteredArray = concatAllFiltered(
name -> name.contains("田") && name.length() >= 3,
classA, classB, classC
);
System.out.println("文字列条件付き配列連結結果:");
for(String name : filteredArray) System.out.println(name);
System.out.println();
// 数値の例(ArrayList)
ArrayList<Integer> listA = new ArrayList<>(Arrays.asList(10, 25, 30));
ArrayList<Integer> listB = new ArrayList<>(Arrays.asList(5, 40, 50));
ArrayList<Integer> listC = new ArrayList<>(Arrays.asList(35, 60));
// 「20以上かつ50未満」の数値だけ連結
ArrayList<Integer> filteredList = concatAllFiltered(
n -> n >= 20 && n < 50,
listA, listB, listC
);
System.out.println("数値条件付きArrayList連結結果:");
for(Integer n : filteredList) System.out.println(n);
}
}
Java2. 実行結果イメージ
文字列条件付き配列連結結果:
田中
田村
山田
数値条件付きArrayList連結結果:
25
30
40
35
3. ポイント
- 複数条件の AND / OR を
Predicate内で自由に組み合わせられる- 例:
name.contains("田") && name.length() >= 3 - 例:
n >= 20 && n < 50
- 例:
- 配列版・ArrayList版の両方に対応
- 複数配列・複数リストをまとめて条件付きで連結可能
- 実務で「複雑条件のフィルタ+結合」を一度に処理できる
💡 初心者向けまとめ
Predicate<T>を使うことで、文字列・数値・オブジェクトなど あらゆる条件を自由に指定 可能- 配列・ArrayList どちらでも同じ感覚で使える
- 関数にまとめることで、再利用性が高く、コードもスッキリ
