Maison > Questions et réponses > le corps du texte
Je suis nouveau dans la syntaxe Java8 et j'ai déjà une compréhension préliminaire de l'utilisation des références lambda表达式
,1.8的静态方法引用
表示法以及1.8的stream
api中forEach()
seules, mais pendant l'exercice, j'ai rencontré le code suivant :
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;
}
Pour cette partie du contenu, si tout est réécrit selon la méthode d'écriture 1.8, comment doit-il être réécrit de la plus belle des manières ? Pour les débutants, par exemple, pour la nouvelle partie exécutable, si vous utilisez lambda表达式
再串联着EXECUTOR::submid
方法和Stearm.forEach()
, vous obtiendrez toujours une erreur de syntaxe, et il y a moins d'informations pertinentes. J'ai cherché beaucoup d'informations et j'espère que certains seniors n'y parviendront pas. utilisez le formulaire de syntaxe 1.8 pour compiler le code ci-dessus pour mieux comprendre les nouvelles fonctionnalités de java8.
怪我咯2017-05-17 10:06:45
Après y avoir jeté un coup d'œil, hors gestion des exceptions, il peut être réécrit comme le code suivant :
return Arrays.stream(Region.values())
.flatMap(region -> vehicleLoader.getVehicleMakesByRegion(region.name()).stream())
.distinct()
.filter(make -> make.getName() != null)
.collect(Collectors.toCollection(ConcurrentSkipListSet::new));
某草草2017-05-17 10:06:45
Changez d'abord la classe interne anonyme en fonction de flèche, puis changez for en forEach