搜尋

首頁  >  問答  >  主體

關於java8新特性中的lambda表達式,靜態方法引用以及stream api迭代的寫法

初學java8的語法,對於單獨使用lambda表達式,1.8的靜態方法引用表示法以及1.8的streamapi中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的新特性。

世界只因有你世界只因有你2750 天前771

全部回覆(2)我來回復

  • 怪我咯

    怪我咯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));

    回覆
    0
  • 某草草

    某草草2017-05-17 10:06:45

    先把 匿名內部類別改成 箭頭函數 在將for改為forEach

    回覆
    0
  • 取消回覆