Heim > Fragen und Antworten > Hauptteil
Ich bin neu in der Java8-Syntax und habe bereits ein vorläufiges Verständnis für die Verwendung von lambda表达式
,1.8的静态方法引用
表示法以及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表达式
再串联着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.
怪我咯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));