2016-10-14 2 views
3

Developerというプロパティを持つリストAがあります。リストAが財産プロダクトマネージャーとプロパティをリストAのものと同じであるBをリストに変換することが求められているプロパティを持つリストを別のリストに変換する方法は、Java 8の方法ですか?

List<Developer> A = ImmutableList.of(new Developer("Ivan", 25), new Developer("Curry", 28)); 

:プロパティを持つ

@Getter 
@Setter 
public class Developer { 
    private String name; 
    private int age; 

    public Developer(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    public Developer name(String name) { 
     this.name = name; 
     return this; 
    } 

    public Developer name(int age) { 
     this.age = age; 
     return this; 
    } 
} 

は、リストA:開発者のスキーマがあることが好きです

public List<ProductManager> convert() { 
    List<ProductManager> pros = new ArrayList<>(); 
    for (Developer dev: A) { 
     ProductManager manager = new ProductManager(); 
     manager.setName(dev.getName()); 
     manager.setAge(dev.getAge()); 
     pros.add(manager); 
    } 
    return pros; 
} 
0123:昔

@Getter 
@Setter 
public class ProductManager { 
    private String name; 
    private int age; 

    public ProductManager(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    public ProductManager name(String name) { 
     this.name = name; 
     return this; 
    } 

    public ProductManager name(int age) { 
     this.age = age; 
     return this; 
    } 
} 

、我々のようなコードを記述します

私はJava 8でもっと上品で簡単な方法で上記を書くことができますか?このようなおそらく

+3

ここで本当の問題があります'name'と' age'をカプセル化する共通のスーパークラス 'Person'を継承しているようです。あなたが気の利いたJava8の鐘や笛にアップグレードする前に、おそらくデザインの権利を得るべきです。 –

+0

@ジムガリソンはい、私はあなたに同意する、私は基本にもっと注意を払う必要があります。より多くのプロパティ、多分20以上の場合、コンストラクタは直接使用することはできません、どのように変換する? – Ivan

+1

'Developer'と' ProductManager'に共通の基本クラス 'Person'があり、すべての共通プロパティを定義していれば、両方のクラスに' Person'パラメータを持つコンストラクタを定義することに問題はありませんでした。これらのコンストラクタは、作業を行う 'Person'基本クラスのコンストラクタに委譲するだけなので、一度だけ実装する必要があります。これは確立されたパターンであることに注意してください。つまり、すべての標準的な 'Collection'型は、コピー元の' Collection'引数を受け入れるコンストラクタを提供します。 – Holger

答えて

4

あなたは、以下のようなものを使用する必要があります:属性を想定したプロパティの大#は似てい

List<ProductManager> B = A.stream() 
     .map(developer -> new ProductManager(developer.getName(), developer.getAge())) 
     .collect(Collectors.toList()); 

//ために名前 //名前が異なる他の賢者を参照this

List<ProductManager> B = A.stream().map(developer -> { 
      ProductManager productManager = new ProductManager(); 
      try { 
       PropertyUtils.copyProperties(productManager, developer); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
      return productManager; 
     }).collect(Collectors.toList()); 

     B.forEach(System.out::println); 
+0

プロパティが20以上あり、コンストラクタが直接使用できない場合、変換する方法は? – Ivan

+1

@IvanはPropertyUtilsでサンプルを追加しました。簡単な方法です。 –

0

、:

List<ProductManager> B = A.stream() 
     .map(developer -> new ProductManager(developer.name, developer.age)) 
     .collect(Collectors.toList()); 
0

あなたは

public ProductManager(Developer d) { 
    this.name = d.getName(); 
    this.age = d.getAge(); 
} 

ProductManger

でbelwoコンストラクタを追加する細かいある場合、それ以外の場合は、あなたが提供することができますコンストラクタ参照

List<Developer> developers = Arrays.asList(new Developer("abc", 25)); 
    List<ProductManager> managers = developers.stream().map(ProductManager::new).collect(Collectors.toList()); 
    System.out.println(managers); 

を使用して変換しますカスタムマッパー

機能で
Function<Developer, ProductManager> mapper = d -> new ProductManager(d.getName(), d.getAge()); 

使用これを

出力

[ProductManager [name=abc, age=25]] 
+0

多くのプロパティ、多分20以上のものがあり、コンストラクタが直接使用できない場合、どのように変換するのですか? – Ivan

+0

上記のマッパー関数ではなく、プロダクトマネージャオブジェクトを作成し、そのプロパティをすべて設定して返します – Saravana

0

が多分20以下、複数のプロパティであり、コンストラクタ は直接使用できない場合は、どのように変換するには?

あなたが設定する任意の複数の3-4の特性を持っている場合は、Builderを使用する必要があり、そのよう: `Developer`と` ProductManager`がない理由

List<Developer> A = ImmutableList.of(new Developer("Ivan", 25), 
            new Developer("Curry", 28)); 

Function<Developer, ProductManager> converter = dev -> new ProductManagerBuilder() 
     .setAge(dev.getAge()) 
     .setName(dev.getName()) 
     .setProperty1(dev.getProperty1()) 
     .setProperty2(dev.getProperty2()) 
     ... 
     .build(); 

List<ProductManager> productManagers = A.stream() 
             .map(converter) 
             .collect(toList()); 
+0

ビルドパターンを使用するのですか?そうです。私の質問は、コンストラクタではなく内部のマップに関数本体を書く方法でした。ビルダーパターンはこのサンプルでコンストラクタのように機能するので、とにかく私の意図ではありません。 – Ivan

関連する問題