search

Home  >  Q&A  >  body text

About lambda expressions, static method references and stream api iteration in the new features of java8

Beginner's syntax of java8, for using lambda expressions alone, 1.8's static method referencenotation and 1.8's streamapi forEach I already have a preliminary understanding of the reference of (), but during the exercise, I encountered the following code:

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;
    }

 

For this part of the content, if it is all rewritten to the 1.8 writing method, how should it be rewritten in the most beautiful way? For beginners, for example, for the new runnable part, if lambda expression is used in series with the EXECUTOR::submid method and Stearm.forEach() , grammatical errors are always reported, and there is less relevant information. I have searched a lot of information and still have no solution. I hope that some seniors can rewrite the above code using the 1.8 syntax form to better understand the new features of Java8.

世界只因有你世界只因有你2782 days ago798

reply all(2)I'll reply

  • 怪我咯

    怪我咯2017-05-17 10:06:45

    After taking a look, excluding exception handling, it can be rewritten as the following code:

    return Arrays.stream(Region.values())
            .flatMap(region -> vehicleLoader.getVehicleMakesByRegion(region.name()).stream())
            .distinct()
            .filter(make -> make.getName() != null)
            .collect(Collectors.toCollection(ConcurrentSkipListSet::new));

    reply
    0
  • 某草草

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

    First change the anonymous inner class to arrow function and then change for to forEach

    reply
    0
  • Cancelreply