Java 可选的.flatMap()和Stream.flatMap()之间有什么区别

Java 可选的.flatMap()和Stream.flatMap()之间有什么区别,java,methods,java-8,java-stream,optional,Java,Methods,Java 8,Java Stream,Optional,可选的.flatMap()和Stream.flatMap()之间有什么区别 正在运行的正确flatMap: List<ObjectDTO> collect = types.stream() .flatMap(a -> client.getSthById(new URI(a)).stream()) .collect(Collectors.toList()); List collect=types.stream() .fla

可选的.flatMap()和Stream.flatMap()之间有什么区别

正在运行的正确flatMap:

    List<ObjectDTO> collect = types.stream()
            .flatMap(a -> client.getSthById(new URI(a)).stream())
            .collect(Collectors.toList());
List collect=types.stream()
.flatMap(a->client.getSthById(新URI(a)).stream()
.collect(Collectors.toList());
在可选设备上使用flatMap时出现异常:

        List<ObjectDTO> collect2 = client.getSthByObj(obje.get(), null).getBrowse()
                .flatMap(uri -> client.getSthById(uri).stream())
                .collect(Collectors.toList());
List collect2=client.getSthByObj(obje.get(),null).getBrowse()
.flatMap(uri->client.getSthById(uri).stream())
.collect(Collectors.toList());
为什么我不能以同样的方式使用它?

可选和流是两种不同的野兽,用于不同的目的

是一个包装器,它保存的结果可以是“存在”或“不存在”(null),并提供了处理这两个条件(存在或不存在)的方法。“flatMap()”操作是应用于可选包装中保存的值的操作。该操作必须返回可选结果:

Optional<String> s = Optional.of("test input");
s.flatMap( input -> Optional.of(input));
Optional s=Optional.of(“测试输入”);
s、 平面图(输入->可选的(输入));
有关
Optional.flatMap()的更多信息,请阅读

'flatmap()帮助您获取和处理列表元素的嵌套元素。有关流的flatmap()的更多解释和说明,请参阅

可选和流是两种不同的野兽,用于不同的目的

是一个包装器,它保存的结果可以是“存在”或“不存在”(null),并提供了处理这两个条件(存在或不存在)的方法。“flatMap()”操作是应用于可选包装中保存的值的操作。该操作必须返回可选结果:

Optional<String> s = Optional.of("test input");
s.flatMap( input -> Optional.of(input));
Optional s=Optional.of(“测试输入”);
s、 平面图(输入->可选的(输入));
有关
Optional.flatMap()的更多信息,请阅读

'flatmap()帮助您获取和处理列表元素的嵌套元素。有关流的flatmap()的更多解释和说明,请参阅

来自javadoc: 可选.flatMap:

flatMap(Function<? super T,Optional<U>> mapper)
flatMap(函数来自javadoc:
可选.flatMap:

flatMap(Function<? super T,Optional<U>> mapper)

flatMap(函数很难从我们不知道使用的变量类型和方法的返回类型的代码片段中确定。但我认为错误的根源是,您试图将返回
流的lambda传递到
可选的.flatMap()

让我们先看看
。获取一个返回
的函数。这似乎正是您在第一个代码片段中给出的

Optional
另一方面:需要一个返回
Optional
的函数。如果
getBrowse()
返回
Optional
,那么传递给
Optional.flatMap
的是
uri->physicalInventoryClient.getSublocationsByIds(uri).stream()
。这看起来像是lambda返回了一个流,而不是一个
可选的
。当我在Eclipse中尝试同样的操作时,会出现如下编译错误:


方法flatMap(函数很难从您的代码片段中确定,我们不知道您使用的变量类型或方法的返回类型。但是我认为您的错误源是您试图将返回
流的lambda传递到
可选的.flatMap()

让我们先看看
。获取一个返回
的函数。这似乎正是您在第一个代码片段中给出的

Optional
另一方面:需要一个返回
Optional
的函数。如果
getBrowse()
返回
Optional
,那么传递给
Optional.flatMap
的是
uri->physicalInventoryClient.getSublocationsByIds(uri).stream()
。这看起来像是lambda返回了一个流,而不是一个
可选的
。当我在Eclipse中尝试同样的操作时,会出现如下编译错误:


平面图法(功能你在问什么?这真的很不清楚,你读过这里关于一个和另一个的文档和许多其他帖子吗?它们执行非常相似的操作,因此名称相同。主要区别是一个需要
可选的
和返回
可选的
方法,而另一个需要
和一个返回
流的方法。你能详细介绍一下你的例子吗?这会有帮助。另外,你说你得到的异常的stacktrace也会很有帮助。你最好澄清你的问题,准确地指出你想做什么,并给出显示你的问题的自给自足的代码片段em()。即使你已经得到了答案,这也会对未来的读者有所帮助。你在问什么?这真的不清楚,你有没有阅读过这里关于一个和另一个的文档和许多其他帖子?它们执行非常相似的操作,因此名称相同。主要区别在于,一个需要一个
可选的
和一个可以将一个
可选的
,而另一个需要一个
和一个返回
的方法。你能详细说明你的例子吗?这会有帮助。另外,你说你得到的异常的堆栈跟踪也会很有帮助。你最好澄清你的问题,以准确地指出你在尝试什么并给出显示问题的自给自足的代码段()。即使你已经得到了答案,这也会对未来的读者有所帮助。对不起,这是我在stackoverflow中的第一个问题。这个答案满足了我的期望。非常感谢!我们都在学习。是的,学习如何使用这个网站需要一些时间。欢迎!顺便说一句,我想到了一个不同的解决方案,并将其添加到了答案中。对不起我,这是我在stackoverflow中的第一个问题。这个答案满足了我的期望
    List<SublocationBrowseDTO> collect2 = physicalInventoryClient.getSublocationsByLocation(masterLocation.get(), null)
            .getBrowse()
            .map(uri -> physicalInventoryClient.getSublocationsByIds(uri))
            .orElse(Collections.emptyList());