Java 8'in lambdalar ve varsayılan yöntemler arabirimleriyle ilgili özelliklerini çok takdir ediyorum. Yine de, kontrol edilen istisnalar dışında hala sıkıldım. Örneğin, bir nesnenin tüm görünür alanlarını listelemek istersem, şunu yazmak istiyorum:
Arrays.asList(p.getClass().getFields()).forEach(
f -> System.out.println(f.get(p))
);
Bununla birlikte, get
yöntem, Consumer
arayüz sözleşmesini kabul etmeyen, işaretli bir istisna atabildiğinden , bu istisnayı yakalayıp aşağıdaki kodu yazmam gerekir:
Arrays.asList(p.getClass().getFields()).forEach(
f -> {
try {
System.out.println(f.get(p));
} catch (IllegalArgumentException | IllegalAccessException ex) {
throw new RuntimeException(ex);
}
}
);
Ancak çoğu durumda sadece istisnanın atılmasını istiyorum ve RuntimeException
derleme hatası olmadan istisnayı programın işlemesine izin verip vermemeyi istiyorum.
Bu nedenle, kontrol edilen istisnalar sıkıntısı konusundaki tartışmalı geçici çözümüm hakkında fikrinizi almak istiyorum. Bu amaçla, yardımcı bir arayüz ConsumerCheckException<T>
ve bir yardımcı fonksiyon oluşturdum rethrow
( Doval'ın yorumunun önerisine göre güncellendi ):
@FunctionalInterface
public interface ConsumerCheckException<T>{
void accept(T elem) throws Exception;
}
public class Wrappers {
public static <T> Consumer<T> rethrow(ConsumerCheckException<T> c) {
return elem -> {
try {
c.accept(elem);
} catch (Exception ex) {
/**
* within sneakyThrow() we cast to the parameterized type T.
* In this case that type is RuntimeException.
* At runtime, however, the generic types have been erased, so
* that there is no T type anymore to cast to, so the cast
* disappears.
*/
Wrappers.<RuntimeException>sneakyThrow(ex);
}
};
}
/**
* Reinier Zwitserloot who, as far as I know, had the first mention of this
* technique in 2009 on the java posse mailing list.
* http://www.mail-archive.com/javaposse@googlegroups.com/msg05984.html
*/
public static <T extends Throwable> T sneakyThrow(Throwable t) {
throw (T) t;
}
}
Ve şimdi sadece yazabilirim:
Arrays.asList(p.getClass().getFields()).forEach(
rethrow(f -> System.out.println(f.get(p)))
);
Bunun, kontrol edilen istisnalar dışında kalan en iyi deyim olduğundan emin değilim, ancak açıkladığım gibi, kontrol edilen istisnalarla uğraşmadan ilk örneğime ulaşmak için daha uygun bir yol istiyorum ve bu bulduğum en basit yol. yapmak için.
sneakyThrow
içine rethrow
sarmak yerine orijinali işaretli istisnayı atmak için içini kullanabilirsiniz RuntimeException
. Alternatif olarak , aynı şeyi @SneakyThrows
yapan Project Lombok'tan ek açıklama kullanabilirsiniz .
Consumer
s'nin forEach
paralel Stream
s kullanılırken paralel bir şekilde yürütülebileceğini unutmayın . Tüketici ile birlikte atılmaktan atılan bir fırlatma, daha sonra, 1) diğer eşzamanlı çalışan tüketicileri durduramayacak, uygun olabilecek veya uygun olmayacak, ve 2) tüketicilerin birden fazla bir şeyi atması durumunda, Atılabilir eşyalardan biri çağıran iplik tarafından görülecektir.