初學java8的語法,對於單獨使用lambda表達式
,1.8的靜態方法引用
表示法以及1.8的stream
api中forEach ()
的引用已經有了初步了解,但是在做練習的過程中,遇到瞭如下程式碼:
public class Java8 {
private static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public static NavigableSet<String> getUniqueAndNavigableLowerCaseMakeNames(VehicleLoader vehicleLoader) {
Region[] regions = Region.values();
final CountDownLatch latch = new CountDownLatch(regions.length);
final Set<VehicleMake> uniqueVehicleMakes = new HashSet<>();
for (Region region : regions) {
EXECUTOR.submit(new Runnable() {
@Override public void run() {
List<VehicleMake> regionMakes = vehicleLoader.getVehicleMakesByRegion(region.name());
if (regionMakes != null) {
uniqueVehicleMakes.addAll(regionMakes);
}
latch.countDown();
}
});
}
try {
latch.await();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new RuntimeException(ie);
}
NavigableSet<String> navigableMakeNames = new ConcurrentSkipListSet<>();
for (VehicleMake make : uniqueVehicleMakes) {
if (make.getName() == null) {
continue;
}
navigableMakeNames.add(make.getName().toLowerCase());
}
return navigableMakeNames;
}
對於這部分內容,如果全部改寫成1.8的寫法,應該如何改寫最美?初學這部分內容,例如對於new runnable部分,如果是lambda表達式
再串聯著EXECUTOR::submid
方法和Stearm.forEach()
使用的話,文法上總是會報錯,而且相關資料較少,查詢了很多資料也沒有解決,希望有前輩可以用1.8的語法形式把以上代碼改寫一下,以便更好的理解java8的新特性。
怪我咯2017-05-17 10:06:45
看了一下,刨去異常處理,可以改寫為以下程式碼:
return Arrays.stream(Region.values())
.flatMap(region -> vehicleLoader.getVehicleMakesByRegion(region.name()).stream())
.distinct()
.filter(make -> make.getName() != null)
.collect(Collectors.toCollection(ConcurrentSkipListSet::new));