2017-02-15 6 views
2

オブジェクト[]配列をint []配列にマップしてフィルタリングしようとしています。オブジェクトがintの場合はうまく動作しますが、そうでない場合はキャスト例外がスローされます。私は何とかラムダ式でtry/catchを付けることができるかどうか疑問に思っていますか?ここに私のコード:オブジェクト配列をInt配列にマップする

b[i] = Arrays.stream(item).mapToInt(e -> (int) e).filter(e -> e % 2 != 0).toArray(); 

またはそれ以上の方法はブロック全体をキャッチしようとしていますか?

+0

いくつかのオブジェクトがintであり、他のオブジェクトがそうでない場合、どのような動作が期待されますか? – mishadoff

+0

もちろん、そうです。私はちょうどどのように全体の配列を削除せずにそれをキャッチしようと思っています。 – ceroeps

+2

は 'filter'を使って有効なオブジェクトのみをマップするか、' e - >(int)e'を 'try/catch'を置く独自のメソッドに移動します。 – Roland

答えて

5

整数型のフィルタオブジェクトはありませんか?

.filter(i -> i instanceof Integer).mapToInt(e -> (int) e) 
+0

ええ、なぜ私はそれを考えなかったのですか?ありがとう! – ceroeps

+4

また、 'lambda'を使用せずに:.filter(Integer.class :: isInstance).mapToInt(Integer.class :: cast)' –

3

Numberに変換しintValue()メソッドを呼び出し、次に、非数値を除去するfilter()を使用。

int[] ints = Arrays.stream(objects) 
    .filter(Number.class::isInstance) 
    .map(Number.class::cast) 
    .mapToInt(Number::intValue) 
    .toArray(); 
+3

'instanceof Number'でテストした後、' int'にキャストすることは明らかに壊れています。 'instanceof Integer'をテストするか、' .mapToInt(o - >((Number)o).intValue()) 'を使ってください。単一の 'mapToInt'の代わりに' .map(o - >(Number)o).mapToInt(Number :: intValue) 'を使うとメソッド参照に非合理的な親和性の印象を作ります。 – Holger

+1

True @Holger、私の答えを更新しました。 –

関連する問題