- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
是否有针对使用 Java @FunctionalInterface/SAM/lambda 表达式的 Java-8 API 编写 Scala 代码的公认技术?
虽然 Java lambda 表达式互操作在 M2 的标志下可用 http://www.scala-lang.org/news/2.12.0-M2 ,我更希望类型类/AnyVal 解决方案可以与 scala.FunctionX 特性一起工作。
不幸的是,scala.FunctionX 扩展了 AnyRef 而不是 Any,因此不能将这些特征使用/混合到隐式 AnyVal 类实现中。
补充:即使 scala.FunctionX 是全局特征(从 Any 扩展),我也不确定我是否想好了如何实现我的目标。我的用例是这样的:
在我的一个项目中,我选择提供带有 FunctionalInterfaces 的 Java-8 API,例如 Java Stream 接口(interface)和类,以迎合尽可能广泛的基于 JVM 的客户端语言的受众,例如闭包、Scala、Kotlin。对于使用我的 Java-8 API 的每种客户端语言,如果访问 Java-8 API 在该语言中感觉笨拙,我将编写适当的绑定(bind)(如有必要)以使用特定于语言的习语。
顺便说一句。我也对在 Kotlin-Java 互操作上下文中对这个问题发表的任何评论感兴趣。
最佳答案
这个 Scala 程序展示了我的问题的一面,即如何让 Scala 函数伪装成 Java 8 Lambdas。
通过创建一些隐式 Scala 函数将 Scala 函数转换为它们的 Java 8 FunctionalInterface 对应类型,从语法和惯用角度来看,这似乎工作得很好。
当然,需要注意的是,此方法没有利用 Java 8 通过 invokedynamic 优化 lambda 创建的能力。
因此,这种方法会导致为 Scala 函数实例创建 JVM 对象,与 Java 8 原生 lambda 相比,这可能会影响内存使用和性能。
对于硬币的另一面,即如何让 Java 8 Lambda 伪装成 Scala 函数,我想人们必须编写一些 Java 代码来与 Scala 互操作(如果人们的目标是拥有 Scala API这是可从 Java 调用的)。
贾斯汀约翰逊,关于我的项目发条的微博,JVM 上 XPath/XQuery 的新实现,作为推特上的@MartianOdyssey
https://twitter.com/MartianOdyssey
/**
* Scala Functions masquerading as Java 8 Lambdas.
*
* (C) Justin Johansson 2015.
*
* Microblogging about my Project Clockwork, a
* new implementation of XPath/XQuery on the JVM,
* as @MartianOdyssey on Twitter (https://twitter.com/MartianOdyssey).
*
* Permission to use this code is granted under Apache License,
* Version 2.0 and providing attribution is afforded to author,
* Justin Johansson.
*/
package lab
import scala.language.implicitConversions
import java.util.{ Arrays => JArrays, List => JList }
import java.util.function.{ Consumer => JConsumer, Function => JFunction, Predicate => JPredicate }
import java.util.stream.{ Stream => JStream }
object JLambda extends App {
println("JLambda: Scala to Java 8 lambda test")
implicit def func1ToJConsumer[T](func: T => Unit): JConsumer[T] = {
new JConsumer[T] {
def accept(arg: T): Unit = func(arg)
}
}
implicit def func1ToJFunction[T, R](func: T => R): JFunction[T, R] = {
new JFunction[T, R] {
def apply(arg: T): R = func(arg)
}
}
implicit def func1ToJPredicate[T](func: T => Boolean): JPredicate[T] = {
new JPredicate[T] {
def test(arg: T): Boolean = func(arg)
}
}
val myList = JArrays.asList("cake", "banana", "apple", "coffee")
println(s"myList = $myList")
val myListFiltered: JStream[String] = myList.stream
.filter { x: String => x.startsWith("c") }
val myListFilteredAndMapped: JStream[String] = myListFiltered
.map { x: String => x.toUpperCase }
myListFilteredAndMapped.forEach { x: String => println(s"x=$x") }
}
/*
Outputs:
JLambda: Scala to Java 8 lambda test
myList = [cake, banana, apple, coffee]
x=CAKE
x=COFFEE
*/
关于java - Scala 与没有 2.12 M2 标志的 Java SAM 互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31798902/
我正在构建一些无服务器应用程序并尝试使用 SAM。我已经阅读了一些教程和一些使用 sam build ,而其他人使用 sam package . 这些命令之间有什么区别?似乎 sam 包更难使用。 最
我有一个 AWS SAM 模板,它定义了一个引用其他几个嵌套应用程序的应用程序。 我需要将一个嵌套应用程序的输出传递给另一个嵌套应用程序的参数,但我不确定语法是否正确。 这是包含嵌套应用程序的模板示例
我使用 JSONschema 定义了一个模型并将其设置为 lambda。我可以看到模型被添加到请求正文中,如下图所示 但我还需要设置请求验证器来验证它。这是我下面的示例 AWS SAM 模板。 Res
我正在尝试创建具有多个 AWS 无服务器功能的 AWS SAM 应用程序。 该应用程序有 1 个 template.yaml 文件,其中包含 2 个不同的无服务器 lambda 函数的资源,例如“Co
我一直在寻找 aws-sam-local 单元测试策略,但没有找到太多。只是在寻找建议? 最佳答案 要在“tests”目录中运行“test_handler.py”,您可以执行以下操作。您可能不需要所有
我正在尝试按照 Hello World example 部署 AWS 无服务器应用程序,但在使用 sam deploy --guided 时出现安全约束不满足错误。我在每个提示下按 Enter 以接受
我正在开发一个用 python3.6 编写的 Lambda 函数以进行本地测试,然后在工作后部署到 AWS。为此,我正在使用 PyCharm 的 AWS Serverless Toolkit。 不包含
我正在向现有无服务器应用程序添加 SAM 模板。我有一个没有。调用其他 lambda 的 lambda,并且调用者具有指定“被调用者”或调用的 lambda 的 ARN 的策略。在这种情况下,策略创建
使用 sam build我希望不包含 aws-sdk 的命令包,因为 Node.js Lambda 运行时已经包含它。 据我了解sam build对于 nodejs 是 claudia pack 的端
我正在开发具有 lambda 函数的 SAM 应用程序,API 网关作为事件源。 API Endpoint 是一种 POST 方法,需要在请求正文中设置一组参数。 API Gateway 通过使用 A
嗨,我有一个 sam 应用程序,它有一个 lambda 函数,可以从按预期工作的其余端点调用,但是当我尝试使用 sam local start-lambda 或 sam local start-api
我正在尝试使用 SAM(无服务器应用程序模型)和用 Java 编写的 Lambda 构建一个 AWS 应用程序。 通过在模板中使用这样的资源定义,我能够让它在本地运行: Resources: He
我使用 AWS SAM 生成我的 Lambda/API。但我希望能够获取此 RestApi,以便我可以在另一个 SAM 模板中使用它。 这个想法是拥有 1 个基础设施 CloudFormation/S
我可以调用本地 lambda http 端点(sam local start-lambda),但是如何使用(模拟)AWS 事件(s3 等)触发该 lambda 端点,就像使用 Dockerized l
我尝试直接将编译后的 CloudFormation 文件与 SAM Local 结合使用。我找不到办法做到这一点,有人成功实现了这一点吗? 最佳答案 好吧,假设您想在本地测试您配置的 lambda,您
我目前正在尝试设置一个应该执行简单 TestCafe 测试的 AWS Lambda (nodejs10.x) 函数。 如果我使用 sam local invoke --no-event 在本地运行我的
我使用AWS SAM应用程序和SAM模板来模拟API服务(API Gateway和Lambda)。Lambda运行在Python3.8上。。最近,我升级到了最新版本的SAM CLI。我使用命令‘Sam
按照 https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli
我有一个需要通过 Amazon API Gateway 触发的 lambda 函数。有没有办法将现有的 API(使用 AWS 控制台创建)包含到 AWS SAM 模板中? 最佳答案 SAM 尚不支持模
在尝试 SAM 部署时,我收到以下拒绝信息: 1 validation error detected: Value 'arn:aws:iam::${AWS::AccountId}:role/Lambd
我是一名优秀的程序员,十分优秀!