2012-01-24 22 views

答えて

16

GuavaIterablesクラスとそのany()実装をチェックしてください。

多かれ少なかれコモンズコレクションの例と同じもので、他の答えではなく、genericized:このメソッドをサポートする

List<String> strings = Arrays.asList("ohai", "wat", "fuuuu", "kthxbai"); 
boolean well = Iterables.any(strings, new Predicate<String>() { 
    @Override public boolean apply(@Nullable String s) { 
     return s.equalsIgnoreCase("fuuuu"); 
    } 
}); 
System.out.printf("Do any match? %s%n", well ? "Yep" : "Nope"); 
+3

+1ジェネリックの欠如はコモンズコレクションの大きな欠点です。 –

+0

@ Anony-Mousse Yeah;それはまだ痛みですが、私はまだそれを使用しています:/ –

+0

これは素晴らしい、ありがとう! – Zugwalt

0

Javaには、この機能が組み込まれていません。 Javascript's some()は、関数ポインタを引数として受け取ります。これは、Javaでネイティブにサポートされているものではありません。しかし、ループを使用してJavaでsome()の機能をエミュレートするのはかなり単純明快で、コールバック機能のためにはインターフェースが必要です。

4

あなたは、Apache commons-collectionsからCollectionUtilsを使用することができます。

evenは述語である
List<Integer> primes = Arrays.asList(3, 5, 7, 11, 13) 
CollectionUtils.exists(primes, even); //false 

Predicate even = new Predicate() { 
    public boolean evaluate(Object object) { 
     return ((Integer)object) % 2 == 0; 
    } 
} 

またはインラインバージョンで:

List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13) 
CollectionUtils.exists(primes, new Predicate() { 
    public boolean evaluate(Object object) { 
     return ((Integer)object) % 2 == 0; 
    } 
}); 

はい、それはです ugly for two理由:

  1. Javaは、(まだ)Single-Abstract-Methodインターフェイスでエミュレートされているファーストクラスの市民としての機能をサポートしていません。
  2. commons-collectionsは、ジェネリックをサポートしていません。

あなたが書くことができScalaのような近代的なJVM言語の一方:

List(3,5,7,11,13,17).exists(_ % 2 == 0) 
+3

別のサードパーティのライブラリがGoogleのグアバで、それは 'Iterables.any([あり) '](http://guava-libraries.googlecode.com/svn/tags/release08/javadoc/com/google/common/collect/Iterables.html)。 – axtavt

+2

そして、Guavaはジェネリックをサポートしています。 ;) –

+0

Java 8にはlambdaがあります。また、SAMクラスは現在、機能インタフェースと呼ばれています。 –

関連する問題