当前位置: 首页 > 知识库问答 >
问题:

强制播放可选或流的内容

洪胜涝
2023-03-14

我希望我可以检查并将可选的内容转换为另一个类或拥有一个空对象,而不是编写自己的方法或类。

对于应用程序中的这个子问题,我希望将树节点实例的自定义用户对象转换为自定义用户对象,前提是树节点是默认可变树节点的实例。

private Optional<CustomUserObject> getCustomUserObject(TreeNode node) {
    Optional<DefaultMutableTreeNode> optDefaultMutableTreeNode = OptionalUtil.cast(Optional.ofNullable(node), DefaultMutableTreeNode.class);
    Optional<Object> optUserObject = optDefaultMutableTreeNode.map(DefaultMutableTreeNode::getUserObject); //
    return OptionalUtil.cast(optUserObject, CustomUserObject.class);
}


/**
 * Maps the given optional, if the containing element is an instance of the given class.
 * Returns empty if the containing object is not an instance of the given class.
 * 
 * @param orgOptional
 *        given optional
 * @param clazz
 *        given class.
 * @return the resulting {@link Optional}.
 */
public static <T, X> Optional<T> cast(Optional<X> orgOptional, Class<T> clazz) {
    return orgOptional //
        .filter(clazz::isInstance) // check instance
        .map(clazz::cast); // cast
}

/**
 * Maps the given stream, if the containing element is an instance of the given class.
 * Returns empty if the containing object is not an instance of the given class.
 * 
 * @param orgStream
 *        given optional
 * @param clazz
 *        given class.
 * @return the resulting {@link Optional}.
 */
public static <T, X> Stream<T> cast(Stream<X> orgStream, Class<T> clazz) {
    return orgStream //
        .filter(clazz::isInstance) // check instance
        .map(clazz::cast); // cast
}

我记得我需要经常以这种方式播放可选或流。它不流利。实际上,我希望java Optional或Stream有一个执行上述步骤的cast方法。我不想编写自己的fluent CustomOptional。我错过什么了吗?有没有更简单的方法?

共有2个答案

慕震博
2023-03-14

我想出了这个可选的

/**
 * Creates a function that tries to cast to the given class.
 * If the given argument is not an instance of the given class <code>Optional.empty()</code> is returned.
 * This function can be used in an <code>optionalObject.flatMap(Functional.cast(SomeClass.class))</code> context.
 * 
 * @param clazz
 *        given Clazz
 * @return Returns an optional of the given class.
 * @param <X>
 *        generic input argument for the function
 * @param <T>
 *        type of the output of the function
 */
public static <X, T> Function<X, Optional<T>> cast(Class<? extends T> clazz) {
    return x -> {
        if (clazz.isInstance(x)) {
            return Optional.of(clazz.cast(x));
        }
        return Optional.empty();
    };
}

使用方法如下:

Optional<DefaultMutableTreeNode> optParent = Optional.of(node) // optional of original node
                    .map(ProfileTreeNode::getParent) // parent of this node.
                    .flatMap(FunctionalUtil.cast(DefaultMutableTreeNode.class)); // cast to DefaultMutableTreeNode
                optParent.ifPresent(y -> y.remove(node));

对于我写的流

/**
 * Creates a function that tries to cast to the given class.
 * If the given argument is not an instance of the given class an empty stream is returned.
 * This function can be used in an <code>stream.flatMap(Functional.castStream(SomeClass.class))</code> context.
 * 
 * @param clazz
 *        given Clazz
 * @return Returns an optional of the given class.
 * @param <X>
 *        generic input argument for the function
 * @param <T>
 *        type of the output of the function
 */
public static <X, T> Function<X, Stream<T>> castStream(Class<? extends T> clazz) {
    return x -> Stream.of(x) // stream of x.
        .filter(clazz::isInstance) // check if instance
        .map(clazz::cast);
}
蒙弘图
2023-03-14

通过使用返回函数的方法,您可以轻松地使其更加流畅。

对于可选的,这很容易,因为map()可以通过返回null来充当过滤器。所以只需定义:

public static <U> Function<Object, U> filterAndCast(Class<? extends U> clazz) {
    return t -> clazz.isInstance(t) ? clazz.cast(t) : null;
}

并将其用作:

Optional<Number> number = Optional.of(42L);
System.out.println(number.map(filterAndCast(Integer.class)));
System.out.println(number.map(filterAndCast(Long.class)));

输出:

Optional.empty
Optional[42]

对于流,您可以通过使用返回空流的函数依赖flatMap()或多或少地应用相同的技巧:

public static <U> Function<Object, Stream<U>> streamFilterAndCast(Class<? extends U> clazz) {
    return t -> clazz.isInstance(t) ? Stream.of(clazz.cast(t)) : Stream.empty();
    // or alternatively
    return t -> Stream.of(t).filter(clazz::isInstance).map(clazz::cast);
}

并将其用作:

Stream.of(42L, "Hello world", 1024, 3.14)
        .flatMap(streamFilterAndCast(Number.class))
        .forEach(System.out::println);

输出:

42
1024
3.14
 类似资料:
  • 我改进了代码,以便从垃圾收集器中获得更好的结果。 现在,当我调用时,它确实释放了所有内存。但是,当我在不调用 的情况下观察内存使用情况时,应用程序确实会保留并使用越来越多的内存。 这是否意味着我的改进正在起作用,我的所有引用都是正确的,我可以忽略JVM是如何自己释放内存的。或者,我的代码中是否存在其他问题,这些问题是JVM在不运行垃圾收集器的情况下保留更多内存的原因。

  • 我想使用gstreamer进行网络传输。目的是启动视频内容(从发射机)并在接收机端播放。我编写了一个用于对网络内容进行流式传输的示例测试代码。 在发射机侧:GST\u DEBUG=“*:2”GST-launch-1.0 videotestsrc!视频/x-raw!jpegenc!rtpjpegpay!udpsink主机=127.0.0.1端口=5001 在接收器端:GST\u DEBUG=“*:2

  • 问题内容: 有没有人(更好)的方法来做到这一点? 可以说我有一个可选的Float 现在我想将其转换为Double 这显然会失败,但是有没有办法像通过计算变量那样通过函数链接可选项?我现在正在做的是这样的: 但是我真的不喜欢将强制转换作为计算变量。 我考虑使用的另一个选项是: 我意识到我可以保护’f’的值来解开它。但是,在许多情况下,可选值将是返回可选函数的参数。这导致防护中的中间值。如本例所示:

  • 我正在尝试制作一个正则表达式字符串,从报告文件中提取数据。棘手的部分是我需要这个单一的正则表达式字符串来匹配多种报告文件内容格式。我希望正则表达式始终匹配,即使没有找到一些可选的组。 取以下报告文件内容(注意:#2 缺少“val2”部分): 文件#1:“-val1-test-val2-的结果-val3-做-” 预期结果: Val1组:测试 Val2组:结果 Val3组:完成 < li >预期结果:

  • 我正在用xamarin开发一个应用程序,用户可以用它来播放电影。我需要应用程序从内存流播放电影,而不是直接从url或文件。是否有一个播放器控件或库,我可以使用它来播放来自mmemory流的电影?

  • 和标题差不多。我在请求正文中有一个可选对象。但是,如果给定了该对象,则它必须包含几个子属性。 我的OpenAPI组件配置如下所示: 我正在使用express openapi validator来验证这一点。现在,我不明白这是否是express openapi validator包的问题,但可选字段(partner)的必填字段(名称、电话)从未验证过。我可以只提供合作伙伴:{},然后直接插入,或者甚