2016-05-12 11 views
2

異なるオブジェクトの別の配列のプロパティからオブジェクトの配列を作成するための簡単な方法(for-loopを書くことはありません)はありますか?Java:別の配列のプロパティから配列を作成する

IタイプAのオブジェクトの配列を有する場合、例えば、のように定義:私は各iためA[i].pの値を含む文字列の配列を作成する

public class A { 
    private String p; 
    public getP() { 
     return p; 
    } 
} 

本質的に、私はこれをやりたいと思います:Creating an array from properties of objects in another arrayしかし、Javaで。

ラムダ式とともにArrays.copyOf(U[] original, int newLength, Class<? extends T[]> newType)を使用しようとしましたが、動作していないようです。私が試したもの:

Arrays.copyOf(arrayA, arrayA.length, (A a) -> a.getP()); 
+0

'System.arraycopy'? – KevinO

+2

あなたはJava 8ストリームを使うことができますが、最終的にforループになるでしょう。 –

+0

[コピーJavaのコピーを作る]の可能な複製(http://stackoverflow.com/questions/5785745/make-copy-of-array-java) –

答えて

3

のJava 8を使用すると、Stream APIと特にmap機能を使用することができます:ここで

A[] as = { new A("foo"), new A("bar"), new A("blub") }; 
String[] ps = Stream.of(as).map(A::getP).toArray(String[]::new); 

を、A::getPString[]::newはメソッド/コンストラクタ参照です。あなたが持っているしたいプロパティに適した方法を持っていない場合は、ラムダ関数を使用することができます:関数型プログラミングでの強力な概念がmapが有用であると呼ばれる場所

String[] ps = Stream.of(as).map(a -> a.getP()).toArray(String[]::new); 
+1

'a - > a.getP()'は 'A :: getP'とどのように異なっていますか? – rom58

+0

そうではありません。ラムダ式のメソッド参照です。 –

+0

@ rom58この場合、これらは同等ですが、メソッド参照のみを使用することを明確に伝えるので、メソッド参照を優先する必要があります。 'a - > a.getP()。trim()。toUpperCase()'のような既存のメソッドなしで関数が必要な場合は、ラムダを使用します(これは、メソッド参照と3つの 'map'を行。 –

1

です。ここでmapが定義されている方法は次のとおりです。

map :: (a -> b) -> [a] -> [b] 

したがって、mapは(aを取り、bを返す)関数とリストを受け取り、リストを返す関数です。与えられた関数を与えられたリストの各要素に適用します。従って、mapは、高次関数である。

Java 8の場合、配列をストリームに変換できる場合は、このイディオムを使用できます。これは、単に行うことができる:mappingFunctionストリームから要素を取得(タイプAの言う)と、別の(タイプBの言う)に変換

あります。あなたが今持っているのは、Bのストリームです。これはコレクター(例えば、リストや配列)内のcollectで簡単に処理できます。

関連する問題