(burada piton uygulanan) böyle bir şey yapar java bir yapı var mı bana ilk yol biraz daha akıllı görünüyor.Java oneliner
cevap
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)
Hayır, dinamik dil yapısının bu tür henüz :-) size seçeneğiyle yaşamak zorunda Yani Java desteklenmez 2
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
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
Veya Java 8: http://blogs.oracle.com/mr/entry/rethinking_jdk7 – Thilo
@Thilo argh, kötü haberler. bağlantı için thx –
bilgi için teşekkürler! – Graslandpinguin