2016-12-13 18 views
-1

並列ストリームとラムダを使用して以下のコードを実行することは可能ですか? 私はそれを通過する方法がわかりません。Java 8 - ExecutorServiceを置き換えるためのラムダとストリーム

public static NavigableSet<String> getDistinctNavigableLowerCaseMakeNames(Loader loader) { 
    String[] regions = {Japan, Germany, USA}; 
    final CountDownLatch latch = new CountDownLatch(regions.length); 

    Set<Make> unique = new HashSet<>(); 
    for (Region region : regions) { 
     EXECUTOR.submit(new Runnable() { 
      @Override public void run() { 
       List<Make> regionMakes = getVehicleMakesByRegion(region); //provides all the vehicles based on the region 
        unique.addAll(regionMakes); 
       latch.countDown(); 
      } 
     }); 
    } 
    try { 
     latch.await(); 
    } catch (InterruptedException ie) { 
     Thread.currentThread().interrupt(); 
     throw new RuntimeException(ie); 
    } 

    return unique; 
} 

Makeは、最終変数id、region、nameからなるクラスです。このようなものについては、それは少し短いどのように見えるか

+1

私たちの靴を履いてください。あなたは複雑なコードを投げ捨てて、基本的に "lambdasとStreamsを使って書き直してください"と尋ねました。助けが必要な場合は、他の人があなたを助けてくれるようにすることはあなた次第です。それはコードが何をしているのかを説明し、問題を解決しようとしていることを示すことです。 –

+0

元のコードが壊れています。スレッドセーフではない 'HashSet'を同時に変更しています。 – Holger

答えて

0

:)

String[] regionArray = {"Japan", "Germany", "USA"}; 
List<String> regions = Arrays.asList(regionArray); 
return regions 
     .parallelStream() 
     .flatMap(r -> loader.getVehicleMakesByRegion(r).stream()) 
     .map(m->m.getName()) 
     .collect(Collectors.toCollection(ConcurrentSkipListSet::new)); 

は、実装はスレッドセーフでなければならないことを指定Loaderインターフェースにコメントを追加することを忘れないでください。

1

私が理解しているように、あなたは地域のリストのためにユニークなメイクを見つけたいと思っています。それはその後、ケースの場合:

Arrays.stream("Japan", "Germany", "USA").parallel() 
    .map(loader::getVehicleMakesByRegion) 
    .flatMap(List::stream) 
    .map(Make::getName) 
    .distinct() 
    ... 

Make.equalsが存在するなら、あなたはgetNamedistinctを移動することができます。 getVehicleByRegionStream<Make>に変更することも意味があります。

関連する問題