Heim  >  Fragen und Antworten  >  Hauptteil

Über Lambda-Ausdrücke, statische Methodenreferenzen und Stream-API-Iteration in den neuen Funktionen von Java8

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的streamapi中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.

世界只因有你世界只因有你2712 Tage vor734

Antworte allen(2)Ich werde antworten

  • 怪我咯

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

    Antwort
    0
  • 某草草

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

    先把 匿名内部类改成 箭头函数 在将for改为forEach

    Antwort
    0
  • StornierenAntwort