逆順処理の再利用パターン
では「逆順処理を含むコードを再利用しやすくするためのリファクタリング(ユーティリティ化・共通関数化)」を紹介します。
1. ユーティリティメソッド化(for文ベース)
public class ListUtils {
public static <T> void forEachReversed(List<T> list, Consumer<T> action) {
for (int i = list.size() - 1; i >= 0; i--) {
action.accept(list.get(i));
}
}
}
Java利用例
List<String> names = List.of("Alice", "Bob", "Charlie");
ListUtils.forEachReversed(names, System.out::println);
Java👉 メリット:
- 逆順処理の境界条件を毎回書かなくてよい
- 可読性・再利用性が高い
2. 逆順ビューを返すメソッド
public class ListUtils {
public static <T> List<T> reversedView(List<T> list) {
List<T> copy = new ArrayList<>(list);
Collections.reverse(copy);
return copy;
}
}
Java利用例
for (String name : ListUtils.reversedView(names)) {
System.out.println(name);
}
Java👉 メリット:
- foreach で自然に逆順処理できる
- 元のリストを壊さない
3. Stream対応ユーティリティ
public class ListUtils {
public static <T> Stream<T> reversedStream(List<T> list) {
return IntStream.range(0, list.size())
.map(i -> list.size() - 1 - i)
.mapToObj(list::get);
}
}
Java利用例
ListUtils.reversedStream(names)
.map(String::toUpperCase)
.forEach(System.out::println);
Java👉 メリット:
- Stream API と組み合わせやすい
- フィルタやマッピング処理を逆順で実行可能
4. Dequeを使った共通処理
public class ListUtils {
public static <T> void forEachReversedDeque(List<T> list, Consumer<T> action) {
Deque<T> deque = new ArrayDeque<>(list);
Iterator<T> it = deque.descendingIterator();
while (it.hasNext()) {
action.accept(it.next());
}
}
}
Java利用例
ListUtils.forEachReversedDeque(names, System.out::println);
Java👉 メリット:
- Deque の
descendingIterator()を活用 - コードがシンプルで安全
まとめ
- for文ベースのユーティリティ → 境界条件を隠蔽して安全
- 逆順ビュー返却 → foreach で自然に逆順処理
- Stream対応 → 宣言的に逆順処理を組み合わせ可能
- Deque活用 → 内部APIを利用して効率的
💡 実務では「逆順処理を毎回書く」のではなく、共通メソッド化してチーム全体で使い回すのがベストです。レビューでも「再利用性が高い」「境界条件のバグを防げる」と評価されます。


