Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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类型返回第一个NOTNULL值? String myFunction(可选instanceWithIdAsString,可选instanceWithIdAsLong){ String resultId=InstanceWithIDassString.map(ClassWithIDassString::getId) .map(id->String.valueOf(id)) .OrelGet(t->InstanceWithidSlong .map(ClassWithIdAsLong::getId)); 返回结果TID; }_Java_Java 8_Optional - Fatal编程技术网

是否可以使用选项为不同的Java类型返回第一个NOTNULL值? String myFunction(可选instanceWithIdAsString,可选instanceWithIdAsLong){ String resultId=InstanceWithIDassString.map(ClassWithIDassString::getId) .map(id->String.valueOf(id)) .OrelGet(t->InstanceWithidSlong .map(ClassWithIdAsLong::getId)); 返回结果TID; }

是否可以使用选项为不同的Java类型返回第一个NOTNULL值? String myFunction(可选instanceWithIdAsString,可选instanceWithIdAsLong){ String resultId=InstanceWithIDassString.map(ClassWithIDassString::getId) .map(id->String.valueOf(id)) .OrelGet(t->InstanceWithidSlong .map(ClassWithIdAsLong::getId)); 返回结果TID; },java,java-8,optional,Java,Java 8,Optional,上面的代码没有编译。。。我收到: 方法引用中的返回类型错误:无法转换java.lang.String 对你 在编写过程中: 不兼容类型:lambda表达式中的参数类型不兼容 在上述名称中,Long是指长包装类。 我做了大量的研究,没有发现任何类似的东西,只是希望能找到一些解决办法。使上述id的类型相同对我来说不是一个选项。问题在于您最后一次调用orElse子句内部可选的map()。因为它是一个可选的字符串,orElse应该返回一个字符串,但在它里面您返回一个可选的字符串 String myFun

上面的代码没有编译。。。我收到:

方法引用中的返回类型错误:无法转换java.lang.String 对你

在编写过程中:

不兼容类型:lambda表达式中的参数类型不兼容

在上述名称中,Long是指长包装类。
我做了大量的研究,没有发现任何类似的东西,只是希望能找到一些解决办法。使上述id的类型相同对我来说不是一个选项。

问题在于您最后一次调用orElse子句内部可选的map()。因为它是一个可选的字符串,orElse应该返回一个字符串,但在它里面您返回一个可选的字符串

String myFunction(Optional<ClassWithIdAsString> instanceWithIdAsString, Optional<ClassWithIdAsLong> instanceWithIdAsLong) {

String resultId = instanceWithIdAsString.map(ClassWithIdAsString::getId)
                .map(id -> String.valueOf(id))
                .orElseGet(t -> instanceWithIdAsLong
                .map(ClassWithIdAsLong::getId));
return resultId;
}
ClassWithIdAsString::getId是否将字符串作为ID返回,ClassWithIdAsLong::getId是否将字符串作为ID返回

如果是,则必须反过来:

 String id = instanceWithIdAsString.map(ClassWithIdAsString::getId)
            .map(id -> String.valueOf(id))
            .orElseGet(() -> instanceWithIdAsLong
            .map(ClassWithIdAsLong::getId).orElse(""));
在这种情况下,如果两个实例都为null,则返回“”

我希望这对你没问题


我希望这能起作用。

您的代码有一些问题:

  • 您不能使用标识符
    id
    作为
    map
    操作的变量,因为它已在封闭范围内声明
  • orElseGet
    采用a,但是您正在执行的
    t->…
    不满足
    供应商
    功能接口的功能描述符
  • orElseGet
    中的
    map
    操作当前返回的是
    可选的
    ,而不是
    字符串
  • 如果调用
    map(classWithIDassString::getId)
    返回一个
    可选的
    ,那么在随后调用
    .map(id->String.valueOf(id))
    时调用
    String.valueOf是多余的(事实上,您根本不需要此操作),并且仅由于重载
    valueOf(Object obj)而工作
  • 所有这些都可以通过以下方式固定:

    String id = instanceWithIdAsString.map(ClassWithIdAsLong::getId)
                .map(id -> String.valueOf(id))
                .orElseGet(() -> instanceWithIdAsLong
                .map(ClassWithIdAsString::getId).orElse(""));
    

    当您使用
    .map
    时,流处理map返回值,因此您将实体传递到map并映射到
    String
    ,然后处理字符串。我认为最好在
    myFunction
    方法中返回
    Optional
    而不是
    String
    。谢谢!它起作用了。作为使用工作代码的第一个答案,我会接受。谢谢你的回答,但在使用代码的第一个答案之后,我现在明白你的确切意思了。
    String id = instanceWithIdAsString
                    .map(ClassWithIdAsString::getId)                 
                    .orElseGet(() -> String.valueOf(instanceWithIdAsLong
                                           .map(ClassWithIdAsLong::getId)
                                           .orElse(-1)));