2015-11-04 40 views
8

Guava's ClassPath Kullanma Belirli bir pakette bulunan sınıfları başlatmaya çalışıyorum, ancak özel durumları yaymadığından başlatıcıyı kullanmak istiyorum.Döngüsel Arabirim kullanırken orElseThrow

ClassPath.from(classLoader).getTopLevelClasses("test.package").stream() 
    .map(ClassPath.ClassInfo::load) 
    .map(Class::getConstructors) 
    .map(Arrays::stream) 
    .map(constructorStream -> constructorStream 
     .filter(constructor -> constructor.getParameterCount() == 0) 
     .findAny() 
     .orElseThrow(RuntimeException::new) 
    ); 

Ancak bu sadece basitçe Döngüsel arayüz belirten InteliJ bir hata veriyor: Öyleyse bu, kurucular almak için dışarı çalıştı budur. Cyclic arayüzünün ne olduğunu biliyorum, ancak bunun neden bu hataya neden olacağından emin değilim. Geri dönüş türü bilindiği sürece (orElseThrow için bu durumda Constructor<?> olarak bir dönüş değeri vardır), işaretlenmemiş bir istisna atmak iyi olmalıdır. orElse(null) kullanırsam, hata gider. Burada neler oluyor ve atmak istediğim RuntimeException'ı nasıl atabilirim?

+1

Belirli bir türle "orElseThrow" önekini alırsanız ne olur? '. orElseThrow (RuntimeException :: new)' – RealSkeptic

+0

Hata kaldırıldı ve şimdi amaçlandığı gibi çalışıyor. Neden olsa? "X" zaten sağlanan istisna ile tanımlanmamalıdır? – danthonywalker

+1

Sanırım, tür çıkarımını çok sık yapmayan bir derleyici kullanıyorsunuz. Eclipse'de, açık tip argümanı olmadan çalışır. Oracle'ın javacında, bildirilmemiş bir istisna hakkında şikâyetçi. – RealSkeptic

cevap

0

runtimeexception harita lambda içinden atılır. Acual istisnası Stream api içinde ele alınabilir.

Bunu engellemek için, flatMap yönteminize sağlanan birleşik akışlarla geçerli akışın yerini almak için flatMap yöntemini kullanabilirsiniz. Bu, akışları birleştirirken yaygın olarak kullanılır. Ayrıca bkz. Bu örnekte istisna akış akışından geçmek zorunda değildir; bu nedenle, kontrol edilen istisnaları da kullanabilirsiniz ve hiçbir başlatma maddesi içermeyen Akış arayüzünde imza tarafından sınırlandırılmamış olabilirsiniz.

ClassPath.from(classloader).getTopLevelClasses("test.package").stream() 
      .map(ClassPath.ClassInfo::load) 
      .map(Class::getConstructors) 
      .flatMap(Arrays::stream) 
      .filter(constructor -> constructor.getParameterCount() == 0) 
        .findAny() 
        .orElseThrow(RuntimeException::new); 
İlgili konular