Rumah > Soal Jawab > teks badan
Saya baru dalam sintaks Java8 dan sudah mempunyai pemahaman awal menggunakan lambda表达式
,1.8的静态方法引用
表示法以及1.8的stream
api中forEach()
sahaja untuk rujukan Namun, semasa latihan, saya menemui kod berikut:
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;
}
Untuk bahagian kandungan ini, jika semuanya ditulis semula kepada kaedah penulisan 1.8, bagaimanakah ia harus ditulis semula dengan cara yang paling indah? Untuk pemula, sebagai contoh, untuk bahagian runnable yang baru, jika anda menggunakan lambda表达式
再串联着EXECUTOR::submid
方法和Stearm.forEach()
, anda akan sentiasa mendapat ralat sintaks, dan terdapat maklumat yang kurang relevan Saya telah mencari banyak maklumat dan saya harap sesetengah warga emas boleh gunakan borang sintaks 1.8 untuk menyusun kod di atas untuk lebih memahami ciri baharu java8.
怪我咯2017-05-17 10:06:45
Selepas melihat, tidak termasuk pengendalian pengecualian, ia boleh ditulis semula sebagai kod berikut:
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
Mula-mula tukar kelas dalaman tanpa nama kepada fungsi anak panah dan kemudian tukar kepada forEach