2017-12-21 19 views
5

中にflatMap内のメソッドを参照してラムダを交換して、我々はCustomerクラスがあるとしましょう:私たちは車の上にマップする必要がは、配列マッピング

public class Customer { 
    private Car[] cars; 
    // getter, setter, constructor 
} 

と顧客のコレクション。

は現在、私はこのように何とかそれをやっている:それはうまく動作しますが、

Collection<Customer> customers = ... 
customers.stream().flatMap(
     customer -> Arrays.stream(customer.getCars()) 
)... 

コードは、エレガントなを見ていません。私は実際には、より読みやすく、よりコンパクトに見えるメソッド参照を使用するコードに置き換えることが大切です。しかし、配列型のフィールドを使用することは困難です。

質問:flatMapコールを強化する手段はありますか?もっと読みやすく/コンパクトでクリアなものになりますか?

+6

あなたは 'customers.stream()。map(Customer :: getCars).flatMap(Arrays :: stream)'を実行できますが、あなたのソリューションは読みやすく優雅です。 –

答えて

7

次の2つの呼び出しにflatMapコールを分割することができます - メソッド参照受ける各 - mapflatMap:あなたが使用することができ

Collection<Customer> customers = ... 
customers.stream() 
     .map(Customer::getCars) 
     .flatMap(Arrays::stream)... 
3

.map(Customer::getCars) 
.flatMap(Arrays::stream) 

をしかし、私はこれがあるとは思いませんどんな意味でもelegantです。また、このようなメソッド参照としてすべてを持つことは、少なくとも私にとっては読みにくくなります。私はこのコードを読むときに今理解する必要がある2つの段階があるので、私はこれを読みにくく見える理由として自分自身を説明すべきです。なぜmapが行われ、なぜflatMapが行われたのですか?

6

Customerにストリームを返すだけで、Carのストリームが返されます。一般的な命名規則を使用して、それが次に

public Stream<Car> cars() { 
    return Arrays.stream(cars); 
} 

ようになり、あなたは一般的に

customers.stream().flatMap(Customer::cars) 

のようにそれを使用することができ、配列のような可変タイプのプロパティは、注意して取り扱ってください。ゲッターによる変更を防ぐ唯一の方法は、コピーを作成することです。したがって、コピーを必要としないStreamのような読み取り専用タイプを返す代替メソッドを提供することは、flatMapをきれいにすること以外の付加的な用途を有する。

+5

このアプローチでは、車の配列が 'null'の場合、メソッドでこのケースを扱うことができるという特別な利点があります。' return cars == null? Stream.empty():Arrays.stream(cars); ' –

関連する問題