2017-12-26 8 views
2
OptionalInt max=IntStream.of(arr).max(); 

ORJavaのOptionalIntとintの違いは?

int maximum=0; 
for (int i:arr) { 
    maximum=Math.max(i,maximum); 
} 

これらの両方の方法は、最大値を返します! OptionalIntとは何が違いますか? OptionalIntの定義に従って、valueが存在する場合はgetasIntValue()を返しますが、valueが存在しない場合はExceptionをスローします。

答えて

2

不可欠アプローチ上ストリームアプローチを使用することの利点は、要素が配列arrに存在しない場合、我々は欠損値を示すため不在として最大値を表すことです。

あなたが述べられました。この説明について:値が存在する場合、それは getasIntValueを()返しますが、値が存在しない場合、それは例外をスローした場合OptionalIntの定義に従って

を、。オプションの結果から直接getAsInt()を呼び出し、値が不在ある場合にのみ、それが例外をスローすることを

注意。

これは、上記のようにgetAsInt()を使用して要素にアクセスしようとしたときに値が存在しない場合、NoSuchElementExceptionがスローされ、実際には例外が発生するなぜなら、値が存在しないことが分かっているからです。命令型アプローチはバグを隠すことにつながりますが、配列が空の場合は最大値は0です。これは、2番目から最後の段落以下。

このような小さなコードは、バグがあっても実動コードでは簡単に修正できますが、コードベースのサイズのために見つけるのが難しいかもしれません。0がある場合、配列は、あなたが絶対に必要なアプローチを進めることができます空のときにそれを行うことができた場合、またはオプションのアプローチを使用して

は、実際には、デフォルトでは、あなたが提供したいなど:

int max = IntStream.of(arr).max() 
        .orElse(0); 

上記のシナリオでは、NoSuchElementException例外はスローされません。また、配列が空でないことを100%保証しない限り、オプションの結果から直接getAsInt()を使用しないことをお勧めします。特定の状況に最も適していると思われる方法に応じて、orElse,orElseGetまたはorElseThrowを使用します。

+0

はい、そうです。私は巨大なコードベースを持っています。複数のリストまたはリストのタイプが入力されています。それらがnullの場合、基本的にリストまたは配列のスキルが必要です。私は最良のアプローチが 'Optional.ofNullable(productlist).orElseThrow(e-> e.emptyList())だと思った。 –

3

最初のスニペットで、arrが空の場合、最大値はありません。 OptionalIntは空である(すなわち、値を含まない)。

arrが空の場合、2番目のスニペットでは、最大値はデフォルトで0です。 OptionalIntことなく、第1のスニペットのロジックを実装

null値を含むことができるInteger変数を使用して行うことができる。

Integer maximum = null; 
for (int i:arr) { 
    maximum = maximum != null ? Math.max(i,maximum) : i; 
} 

arrが空の場合、今maximumnull残ります。

+1

@AniketSahrawatあなたは何を言っているのか分かりません。 – Eran

1

arrが空の場合、maxは「空」で、最大値は0です。これは技術的には間違いです。

関連する問題