Ich bin neu in der Java8-Syntax und habe bereits ein vorl?ufiges Verst?ndnis für die Verwendung von lambda表達(dá)式
,1.8的靜態(tài)方法引用
表示法以及1.8的stream
api中forEach()
-Referenzen allein, aber w?hrend der übung bin ich auf den folgenden Code gesto?en:
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;
}
Wenn für diesen Teil des Inhalts alles auf die Schreibmethode 1.8 umgeschrieben wird, wie sollte er dann auf die sch?nste Weise umgeschrieben werden? Wenn Sie beispielsweise für den neuen ausführbaren Teil lambda表達(dá)式
再串聯(lián)著EXECUTOR::submid
方法和Stearm.forEach()
verwenden, erhalten Sie immer einen Syntaxfehler, und ich habe viele Informationen gesucht und hoffe, dass einige Senioren keine L?sung finden Verwenden Sie die Syntaxform 1.8, um den obigen Code zu kompilieren. Schreiben Sie ihn neu, um die neuen Funktionen von Java8 besser zu verstehen.
看了一下,刨去異常處理,可以改寫為以下代碼:
return Arrays.stream(Region.values())
.flatMap(region -> vehicleLoader.getVehicleMakesByRegion(region.name()).stream())
.distinct()
.filter(make -> make.getName() != null)
.collect(Collectors.toCollection(ConcurrentSkipListSet::new));