Java | 逆順処理でよくあるバグ集

Java Java
スポンサーリンク

逆順処理の再利用パターン

では「逆順処理を含むコードを再利用しやすくするためのリファクタリング(ユーティリティ化・共通関数化)」を紹介します。


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を利用して効率的

💡 実務では「逆順処理を毎回書く」のではなく、共通メソッド化してチーム全体で使い回すのがベストです。レビューでも「再利用性が高い」「境界条件のバグを防げる」と評価されます。

タイトルとURLをコピーしました