Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Optionant和int之间的区别?_Java_Java 8 - Fatal编程技术网

Java Optionant和int之间的区别?

Java Optionant和int之间的区别?,java,java-8,Java,Java 8,或 这两种方法都返回最大值。optionant有什么不同?根据optionant的定义,如果值存在,则返回getAsInt(),但如果值不存在,则在第一个代码段中抛出一个异常,如果arr为空,则没有最大值。optionant将为空(即不包含任何值) 在第二个代码段中,如果arr为空,则默认情况下最大值为0 不使用optionant实现第一个代码段的逻辑可以使用Integer变量来完成,该变量可以包含null值: int maximum = 0; for (int i : arr) {


这两种方法都返回最大值。
optionant
有什么不同?根据
optionant
的定义,如果值存在,则返回
getAsInt()
,但如果值不存在,则在第一个代码段中抛出一个
异常
,如果
arr
为空,则没有最大值。
optionant
将为空(即不包含任何值)

在第二个代码段中,如果
arr
为空,则默认情况下最大值为
0

不使用
optionant
实现第一个代码段的逻辑可以使用
Integer
变量来完成,该变量可以包含
null
值:

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

现在,如果
arr
为空,则
maximum
将保持
null

区别在于,当
arr
为空时,
max
将为“空”,而maximum为0,这在技术上是不正确的。

与命令式方法相比,使用流方法的优势在于,当数组
arr
中没有元素时,我们将最大值表示为缺少,以指示缺少的值

关于此描述,您已声明:

根据Optionant的定义,如果存在值,则返回 getasIntValue(),但若该值不存在,则会引发异常

请注意,只有当您直接从可选结果调用并且该值不存在时,它才会引发异常

这是一件好事,正如您所提到的,当我们尝试使用访问元素时,如果没有值存在,那么将抛出一个
NoSuchElementException
,事实上,在这种情况下,会得到一个异常,可能很有用,因为您现在知道不存在任何值,而命令式方法可能导致隐藏错误,因为如果数组为空,则最大值为
0
,这是错误的,除非在我下面第二段到最后一段提到的某个场景中

当出现bug时,您所展示的这种小代码可能很容易修复,但在生产代码中,由于代码库的大小,可能很难找到

如果
0
实际上是数组为空时要提供的默认值,则可以按原样继续使用命令式方法,也可以按如下方式使用可选方法:

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

在上述场景中,将不会引发
NoTouchElementException
异常。另外,我建议不要直接使用可选结果,除非您100%确定数组不会为空。而是利用或取决于您认为最适合给定情况的对象。

Optionant允许我们创建一个可能包含或不包含int值的对象。如果存在一个值,isPresent()将返回true,getAsInt()将返回该值

还提供了依赖于包含值的存在与否的其他方法,如orElse()

与Optionant类似的其他类有OptionalFloat、OptionalDouble、OptionalDouble。 这些可以帮助我们消除由于运行时缺少值而发生的异常

下面是OptionalDouble的一个示例

public class SumAndAverage{
公共静态void main(字符串[]args){
List persons=new ArrayList();
添加(新的人员(“Joe”,55));
新增(新增人员(“Moe”,33));
新增(新增人员(“希尔”,94));
OptionalDouble average=persons.stream().mapToInt(p->p.getAge()).average();
if(average.isPresent()){
System.out.println(average.getAsDouble());
}否则{
System.out.println(“无法计算平均值”);
}
}

}

是的,没错。我有一个巨大的代码库,多个列表或列表类型正在被填充,如果它们为空,我们基本上希望使用该列表或数组。我认为最好的方法是
Optional.ofNullable(productlist).orelsetrow(e->e.emptyList()).stream.foreach(e->e.getId())
Integer maximum = null;
for (int i:arr) {
     maximum = maximum != null ? Math.max(i,maximum) : i;
}
int max = IntStream.of(arr).max()
                   .orElse(0);
public class SumAndAverage {
public static void main(String[] args) {

    List<Person> persons = new ArrayList<>();

    persons.add(new Person("Joe", 55));
    persons.add(new Person("Moe", 33));
    persons.add(new Person("Hill", 94));


    OptionalDouble average = persons.stream().mapToInt(p -> p.getAge()).average();

    if (average.isPresent()) {
        System.out.println(average.getAsDouble());
    } else {
            System.out.println("Could not calculate average.");
    }
}