2010-09-21 13 views

cevap

5

Java 7 might veya might not, kapanışları uygulamak ve dolayısıyla böyle işlevlerini desteklemek, ancak Groovy, Scala veya Clojure bunu yapmak için seçenekleri (mümkünse diğerleri de) sahip Java VM yani şu anda Götürmezse Ancak java'da Guava'nın Collections2.filter() gibi yardımcıları kullanarak buna yakınlaşabilirsiniz.

JDK 7 örnek kod:

findItemsLargerThan(List<Integer> l, int what){ 
    return filter(boolean(Integer x) { x > what }, l); 
} 
findItemsLargerThan(Arrays.asList(1,2,5,6,9), 5) 

Groovy örnek kod:

Arrays.asList(1,2,5,6,9).findAll{ it > 5} 

Guava Örnek Kod:

Collections2.filter(Arrays.asList(1, 2, 5, 6, 9), 
    new Predicate<Integer>(){ 
     @Override 
     public boolean apply(final Integer input){ 
      return input.intValue() > 5; 
     } 
    } 
); 

Scala örnek kod (teşekkürler Bolo):

Array(1, 2, 5, 6, 9) filter (x => x > 5) 
+2

Veya Java 8: http://blogs.oracle.com/mr/entry/rethinking_jdk7 – Thilo

+0

@Thilo argh, kötü haberler. bağlantı için thx –

+0

bilgi için teşekkürler! – Graslandpinguin

0

Hayır, dinamik dil yapısının bu tür henüz :-) size seçeneğiyle yaşamak zorunda Yani Java desteklenmez 2

3

yapabilirsiniz lambdaj'a bakın. hamcrest koşulu ile kullanabileceğiniz seçkin bir yöntem var.

+0

Wow, bu da çok güzel (1) –

1

Hiçbir şey imkansız (-:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class ListCleaner { 

    public static void main(String[] args) { 

     final List<Integer> oldList = Arrays.asList(new Integer[] { 23, 4, 5, 
       657 }); 
     System.out.println(oldList); 

     List<Integer> newList = new ArrayList<Integer>() { 
      { 
       for (Integer element : oldList) { 
        if (element > 5) { 
         this.add(element); 
        } 
       } 
      } 

     }; 
     System.out.println(newList); 
    } 
} 

tek kısıt oldList nihai olmak zorunda olmasıdır

1

Saf Java yapılabilir, ancak bir destek sınıfı Filtre yazmak gerekir. aşağıdaki kod başarıyla çalıştırmak için: durumunda

List<Integer> oldList = Arrays.asList(new Integer[] { 1, 2, 5, 6, 9 }); 
    List<Integer> newList = new Filter<Integer>(oldList) { 
     { 
      findAll(it > 5); 
     } 
    }.values(); 
    System.out.println(newList); // [6, 9] 

merak bu kod Hidden features of Java bakmak derler neden:. Çift bağ başlatma Bu yaratır n değişkenini içeren sınıf filtresinin anonim örneğini ve findAll() yöntemini sağlar.

Filtre sınıfı kendisine yeni bir örneği findall() de boolean durumunu değerlendirmek için her liste elemanı için oluşturulur bir dezavantajı var

public abstract class Filter<T> { 

    protected List<T> values = new ArrayList<T>(); 

    protected T it; 

    public Filter(List<T> values) { 
     if (values != null) { 
      this.values.addAll(values); 
     } 
     if (values.isEmpty()) { 
      throw new RuntimeException("Not for empty collections!"); 
     } 
     it = values.iterator().next(); 
     // instance initializer gets executed here, calls findAll 
    } 

    protected void findAll(boolean b) throws Throwable { 
     // exit condition for future calls 
     if (values.size() > 1) { 
      // only repeat for each entry, if values has multiple entries 
      Iterator<T> iterator = values.iterator(); 
      while (iterator.hasNext()) { 
       // don't evalute again for the first entry 
       if (!b) { 
        iterator.next(); 
        iterator.remove(); 
        b = true; 
       } else { 
        // for each other entry create an argument with one element 
        List<T> next = new ArrayList<T>(); 
        next.add(iterator.next()); 
        // get constructor of anonymous class 
        Constructor<?> constructor = this.getClass().getDeclaredConstructors()[0]; 
        // invoke constructor and thus execute instance initializer again 
        Filter<T> filtered = (Filter<T>) constructor.newInstance(new Object[] { null, next }); 
        // if values is empty, the condition didn't match and the element can be removed 
        if (filtered.values.isEmpty()) { 
         iterator.remove(); 
        } 
       } 
      } 
     } else { 
      // one element can be checked directly 
      if (!b) { 
       values.clear(); 
      } 
     } 
    } 

    public List<T> values() { 
     return values; 
    } 

} 

Ancak örnek oluşturma gibi oldukça ucuz bugünlerde ve Filtre sınıfı, tüm Nesneler için kullanılabilir, Utils paketinize dahil edilmesine değer olabilir.

Greetz, ghad