这个 Java 构造 `(InputStream is) -> () -> {}`

问题描述 投票:0回答:1

我不理解我在此处的文档中看到的 Java 构造。

public static HttpResponse.BodySubscriber 映射(HttpResponse.BodySubscriber 上游, 函数映射器)

我认为我理解但似乎无法复制的部分是示例:

public static <W> HttpResponse.BodySubscriber<Supplier<W>> asJSON(Class<W> targetType) {
    HttpResponse.BodySubscriber<InputStream> upstream = HttpResponse.BodySubscribers.ofInputStream();
    HttpResponse.BodySubscriber<Supplier<W>> downstream = HttpResponse.BodySubscribers.mapping(
            upstream,
            (InputStream is) -> () -> {
                try (InputStream stream = is) {
                    ObjectMapper objectMapper = new ObjectMapper();
                    return objectMapper.readValue(stream, targetType);
                } catch (IOException e) {
                    throw new UncheckedIOException(e);
                }
            }
        );

    return downstream;
}

特别是

(InputStream is) -> () -> {
部分。当我读到它时,我认为它应该是一个
Supplier
,它提供了一个
Function
来完成它所做的事情。然而,当我尝试自己编写这样的代码时,它不起作用。

public static void main(String[] args) throws IOException {
    String r = myMethod((String s)->()->{return s + "ddd";});
}

public static String myMethod(Function<String, String> func) {
    return func.apply("Hello");
}

给我编译错误

Target type of a lambda conversion must be an interface
。然而,
Function
是一个接口。

我不明白什么?

java lambda
1个回答
0
投票

这不是一个函数,这是一个函数

这是 lambda 表达式中的 lambda 表达式,您可以通过使用两个 -> 标记来查看它。在您的情况下,inputParam -> resultExpression,在这种情况下,resultExpression 本身是 () -> resultExpression。所以,是的,一个函数

我应该像这样模仿。

public static void main(String[] args) throws IOException {
    Supplier<String> r = myMethod((String s)->()->{return s + "ddd";});
}

public static Supplier<String> myMethod(Function<String, Supplier<String>> func) {
    return func.apply("Hello");
}

感谢所有评论者。

© www.soinside.com 2019 - 2024. All rights reserved.