好きなコレクションの最初のインデックスを選択する

私は時には私が車輪を再発明していると感じます。

私は、java/jakarta commons/guava /?にユーティリティメソッドがあるかどうか疑問に思っています。これは、コレクション内で深くなり、要素で(テスト、変更、削除)何かを実行します。

私はこの方法を書いたが、今私はそれを行うことができる一ライナーがあると感じている。

/**
 * Find index of first line that contains search string.
 */
public static int findIdx(List list, String search) {
  for (int i = 0, n = list.size(); i < n; i++)
    if (list.get(i).contains(search))
      return i;
  return -1;
}
3
なぜあなたは for(int i = 0、i の代わりに ); i ++)
追加された 著者 Bhesh Gurung,
@Bhesh size()操作が高価な場合の最適化のように見えます。しかし、それはまた、リストのサイズがループ中に固定されたままであることを前提としています。
追加された 著者 Kevin K,
これが私のスタイルです。私はsize()メソッドの呼び出しがどれほど高価であるかはチェックしなかった。
追加された 著者 adfgvx,

2 答え

Guavaには述語を持つ Iterables.indexOf があります。

int index = Iterables.indexOf(list, new Predicate {
        @Override public boolean apply(String input) {
            return input.contains(search);
        }
    });

しかし、あなたは検索を最終的に行う必要があります。しかし、少なくともJava 8では、次のような記述が可能です。

int index = Iterables.indexOf(list, input => input.contains(search));

(あるいは、少なくとも好きとか、おそらく拡張メソッドの構文で...)

5
追加された
非常にエレガントで、一線ではなく美しい。私は実際にコモンズCollectionUtils.findで遊んでいましたが、そのメソッドはインデックスを与えません...
追加された 著者 adfgvx,
2
追加された
うん... Javaと関数型プログラミングはうまくいきません。匿名の Function / Predicate クラスをインスタンス化することで、
追加された 著者 mergeconflict,
あなたのすぐ使える機能のTNX。グアバは非常に強力ですが、まだ多くのタイピングがあります。
追加された 著者 adfgvx,