Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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 用自定义可选类替换从findAny或findFirst返回的可选实例_Java_Api_Java 8_Optional - Fatal编程技术网

Java 用自定义可选类替换从findAny或findFirst返回的可选实例

Java 用自定义可选类替换从findAny或findFirst返回的可选实例,java,api,java-8,optional,Java,Api,Java 8,Optional,我不知道是谁负责这类工作,但对我来说,Javas Optional似乎还没有准备好投入生产。似乎Java创建者只是为了完成工作而进行了分层,结果是一个没有准备好的可选类,缺少许多函数 例如考虑IFON方法。返回类型是void,但它可以是这种类型的一个实例,只是在流框架中有类似peek的东西。把这个放在一个方法中并没有什么大不了的,但不这样做意味着关于可选性的思考还没有准备好 另一个例子是缺少检查方法,认为映射或过滤可能引发异常,导致大量的尝试捕获样板。相反,他们只是添加了一个未选中的例外。样板仍

我不知道是谁负责这类工作,但对我来说,Javas Optional似乎还没有准备好投入生产。似乎Java创建者只是为了完成工作而进行了分层,结果是一个没有准备好的可选类,缺少许多函数

例如考虑IFON方法。返回类型是void,但它可以是这种类型的一个实例,只是在流框架中有类似peek的东西。把这个放在一个方法中并没有什么大不了的,但不这样做意味着关于可选性的思考还没有准备好

另一个例子是缺少检查方法,认为映射或过滤可能引发异常,导致大量的尝试捕获样板。相反,他们只是添加了一个未选中的例外。样板仍然存在。我的意思是,添加检查方法有什么困难

A可以给你更多的例子,但我不想把我的精力和时间花在像选修课这样的不完整的课程上。我开始创建一个可选的替代品,我可能会在将来发布为一个开源项目。我的实现中唯一缺少的是将可选类与流框架相结合的可能性,在流框架中,findAny或findFirst等方法返回我要替换的可选类型。我需要面对这个问题,因为选择当然是最终的

我不知道什么是最好的处理方式,所以我希望这里有人能给我一个很好的提示

提前谢谢

编辑: 我真的觉得这里有些人懒得看我的帖子,所以我想把事情弄清楚

如果我说ifPresent应该返回这个值,当然我不是说Optional包含的值。它指的是“this”实例,这样您就可以链接到下一个命令,就像流框架中的peek一样

public void ifPresent(Consumer<? super T> consumer) {
    if (value != null)
        consumer.accept(value);
}
并没有理由将ifPresent设置为void,而返回它将为您提供更大的链接灵活性。您是否能够使用当前可选类进行这种链接,否

下一个主题是选中的异常。因为有些人没有幻想,所以我将给你一个可能的映射示例,它可以处理选中的异常

@FunctionalInterface
public interface CheckedFunction<T, R, E extends Exception> {
    R apply(T t) throws E;
}

public <U, E extends Exception> OptionalReplacement<U> checkedMap(Class<E> exceptionClass, CheckedFunction<? super T, ? extends U, E> mapper) throws E {
    requireNonNull(exceptionClass);
    requireNonNull(mapper);
    if (!isPresent())
        return empty();
    else {
        return OptionalReplacement.of(mapper.apply(value));
    }
}
这比

    Optional.of(nullable)
            .map(notNull -> {
                try {
                    throw new IOException();
                } catch (IOException e) {
                    return null;
                }
            });
此外,还要对评论中提到的投票发表评论。选票是好的,但人口数量从来不是质量的指标。我对愚蠢的问题投了赞成票,对聪明的问题投了反对票,所以我很好

用户应该更多地考虑我在这里试图面对的问题,而不是用不重要的东西分散注意力

例如考虑IFON方法。返回类型是void,但它可以是这种类型的一个实例,只是在流框架中有类似peek的东西。把这个放在一个方法中并没有什么大不了的,但不这样做意味着关于可选性的思考还没有准备好

Optional
用于提取
null
值。它做得很好:如果
value
null
,您将无法从任何方法中获取
value

现在,如果
null
,那么
ifPresent
应该返回哪个值?这不能是
,因为这将破坏
可选
的主要原则。那么应该退还什么呢?选项包括:

  • 提供类似于
    orElse
    和likes中的值
  • void
    作为返回类型

ifPresent(ConsumerI不相信Optional可以用这种方式被替换,你可以为Optional创建一个包装。我也不认为可以有一个干净的替代品,但最不可能的是一个包装,它很可能是一个替代品。你的问题到底是什么?如果你对Java库的设计有建议或意见,你最好ite到核心LIB-dev@openjdk.java.net.但是关于你所说的:1)Optional在9中得到a;2)Java中的检查异常是有争议的,它的主题比
Optional
要大得多,重新设计它们需要付出很多努力。@LachezarBalev
ifPresent
的返回类型是
void
。关于异常的一点是,
映射程序
不能抛出选中的异常。
@FunctionalInterface
public interface CheckedFunction<T, R, E extends Exception> {
    R apply(T t) throws E;
}

public <U, E extends Exception> OptionalReplacement<U> checkedMap(Class<E> exceptionClass, CheckedFunction<? super T, ? extends U, E> mapper) throws E {
    requireNonNull(exceptionClass);
    requireNonNull(mapper);
    if (!isPresent())
        return empty();
    else {
        return OptionalReplacement.of(mapper.apply(value));
    }
}
OptionalReplacement.of(nullable)
        .checkedMap(IOException.class, notNull -> {
            throw new IOException();
        });
    Optional.of(nullable)
            .map(notNull -> {
                try {
                    throw new IOException();
                } catch (IOException e) {
                    return null;
                }
            });