英文:
How does the imageProxy parameter in this lambda expression get defined?
问题
摘要
在Google的MLKit Vision示例代码中,此lambda表达式 中的imageProxy参数是如何定义的?
详细内容
我理解lambda表达式的基本概念,例如w3schools的示例,以及由Oracle示例提供的更详细示例,但我很难理解MLKit中引用的示例,出于以下原因,因为它似乎与其他示例不同:
- 在
analysisUseCase.setAnalyzer
中没有与变量声明相关联,就像w3schools链接中的最后两个示例一样。因此,我不知道imageProxy如何通过对某个变量的调用在其他地方被定义,因为没有要引用的变量。 - 根据setAnalyzer的javadoc注释,analysisUseCase.setAnalyzer的两个参数应为
setAnalyzer(@NonNull Executor executor, @NonNull Analyzer analyzer)
。除非Analyzer对象是某种Consumer,否则我看不出与w3schools中的第一个示例有任何关系。此外,据我理解,这将意味着lambda表达式应返回这样一个Analyzer对象,但没有返回语句。
此外,Android Studio对其的工具提示显示它解析为androidx.camera.core.ImageProxy imageProxy
。linter如何知道如何解析这个?
作为基本问题,我想知道这是因为我正在修改此示例代码,并希望在我的代码中的其他位置访问imageProxy.getWidth()
方法。如果不理解lambda表达式,我不确定如何访问此对象和关联的方法。
英文:
Summary
How does the imageProxy parameter in this lambda expression within Google's MLKit Vision example code get defined?
Details
I understand the basic concepts of lamda expressions, such as those given in the w3schools examples, and more detailed examples given by the Oracle examples but I am struggling to understand how the quoted one from the MLKit is resolved for the following reasons as it seemingly differs from the other examples:
- There is no variable declaration associated with analysisUseCase.setAnalyzer, like with the two last examples from the w3schools link above. So I don't know how imageProxy would be defined elsewhere via a call to some variable as there is no variable to refer to.
- According to the javadoc comments on setAnalyzer, the two parameters for analysisUseCase.setAnalyzer should be
setAnalyzer(@NonNull Executor executor, @NonNull Analyzer analyzer)
. Unless an Analyzer object is some kind of Consumer, I see no relation to the first example in w3schools. Furthermore, it is my understanding that this would imply the lamda expression should return such an Analyzer object, but there is no return statement.
Furthermore, Android Studio's tooltip for it shows that it resolves to androidx.camera.core.ImageProxy imageProxy
. How does the linter know how to resolve this?
The underlying question as to why I want to know this is that I am modifying this sample code and want access to the imageProxy.getWidth()
method elsewhere in my code. Without understanding the lamda expressions, I am not sure how to access this object and associated method.
答案1
得分: 1
analysisUseCase
的类型是 ImageAnalysis
,它提供了一个名为 setAnalyzer
的方法,该方法的第二个参数是 ImageAnalysis.Analyzer
。
这个 Analyzer
是一个接口,只有一个方法,意味着可以使用 lambda 表达式来替代它。唯一定义的方法是 analyze(ImageProxy image)
,在这种情况下,lambda 表达式实际上就代表了这个方法。正如你所看到的,analyze
的唯一参数是 ImageProxy
。
英文:
analysisUseCase
is of type ImageAnalysis
and offers a method setAnalyzer
that has a ImageAnalysis.Analyzer
as a second argument.
That Analyzer
is an interface with one method meaning a lambda expression can be used in its place. The only method defined is analyze(ImageProxy image)
, and that is what the lambda actually represents in this situation. As you can see the one argument to analyze
is ImageProxy
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论