GVKun编程网logo

Java 8:Lambda-Streams,按方法进行过滤(异常)(java lambda filter过滤)

2

最近很多小伙伴都在问Java8:Lambda-Streams,按方法进行过滤和异常这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展-source1.5中不支持lambda表达式(请

最近很多小伙伴都在问Java 8:Lambda-Streams,按方法进行过滤异常这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展-source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)、AWS Kinesis Lambda DynamoDB我正在尝试使用以下代码通过 Lambda 函数从 Kinesis 摄取数据 DynamoDB、AWS Lambda 上的 Spring Boot 应用程序 - 使用 Docker 容器映像测量 Lambda 函数的冷启动和热启动部分、AWS Lambda 函数在调用另一个 Lambda 函数时超时等相关知识,下面开始了哦!

本文目录一览:

Java 8:Lambda-Streams,按方法进行过滤(异常)(java lambda filter过滤)

Java 8:Lambda-Streams,按方法进行过滤(异常)(java lambda filter过滤)

如何解决Java 8:Lambda-Streams,按方法进行过滤(异常)?

你必须先捕获异常,然后才能转出lambda:

s = s.filter(a -> { try { return a.isActive(); } 
                    catch (IOException e) { throw new UncheckedioException(e); }}});

考虑以下事实:在JDK类中,lambda不在你编写的位置评估,而是在某些完全不相关的位置评估。这样便可以抛出该检查异常,并且在该位置不声明该异常。

你可以通过使用lambda的包装来处理它,该包装将已检查的异常转换为未检查的异常:

public static <T> T uncheckCall(Callable<T> callable) {
  try { return callable.call(); }
  catch (RuntimeException e) { throw e; }
  catch (Exception e) { throw new RuntimeException(e); }
}

你的示例将写为

return s.filter(a -> uncheckCall(a::isActive))
        .map(Account::getNumber)
        .collect(toSet());

在我的项目中,我无需包装即可处理此问题;取而代之的是,我使用一种有效地缓解编译器对异常检查的方法。不用说,应该小心处理,项目中的每个人都必须意识到,未经声明的异常可能会出现在经过检查的异常中。这是管道代码:

public static <T> T uncheckCall(Callable<T> callable) {
  try { return callable.call(); }
  catch (Exception e) { return sneakyThrow(e); }
}
public static void uncheckRun(RunnableExc r) {
  try { r.run(); } catch (Exception e) { sneakyThrow(e); }
}
public interface RunnableExc { void run() throws Exception; }


@SuppressWarnings("unchecked")
private static <T extends Throwable> void sneakyThrow(Throwable t) throws T {
  throw (T) t;
}

IOException即使collect没有声明,你也可能会被扔到脸上。在大多数(但不是全部)实际情况下,无论如何,你都只想抛出异常,并将其作为一般故障进行处理。在所有这些情况下,清晰度或正确性都不会丢失。只是要提防那些其他情况,你实际上想在现场对异常做出反应。编译器不会使开发人员意识到存在一个IOException陷阱,实际上,如果你尝试捕获它,编译器实际上会抱怨,因为我们欺骗了它以为不会抛出此类异常。

解决方法

在尝试Java 8的Lambda表达式时遇到问题。通常它可以正常工作,但是现在我有抛出IOException的方法。最好查看以下代码:

class Bank{
    ....
    public Set<String> getActiveAccountNumbers() throws IOException {
        Stream<Account> s =  accounts.values().stream();
        s = s.filter(a -> a.isActive());
        Stream<String> ss = s.map(a -> a.getNumber());
        return ss.collect(Collectors.toSet());
    }
    ....
}

interface Account{
    ....
    boolean isActive() throws IOException;
    String getNumber() throws IOException;
    ....
}

问题是,它无法编译,因为我必须捕获isActive-和getNumber-Methods的可能异常。但是,即使我显式使用了如下所示的try-catch-Block,它仍然无法编译,因为我没有捕获到Exception。因此,要么JDK中存在错误,要么我不知道如何捕获这些异常。

class Bank{
    ....
    //Doesn''t compile either
    public Set<String> getActiveAccountNumbers() throws IOException {
        try{
            Stream<Account> s =  accounts.values().stream();
            s = s.filter(a -> a.isActive());
            Stream<String> ss = s.map(a -> a.getNumber());
            return ss.collect(Collectors.toSet());
        }catch(IOException ex){
        }
    }
    ....
}

我该如何运作?有人可以提示我正确的解决方案吗?

-source 1.5 中不支持 lambda 表达式   (请使用 -source 8 或更高版本以启用 lambda 表达式)

-source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)

Warning:scala: skipping Scala files without a Scala SDK in module(s) JavaSparkTest

 

Error:(19, 23) java: -source 1.5 中不支持 lambda 表达式
  (请使用 -source 8 或更高版本以启用 lambda 表达式)

AWS Kinesis Lambda DynamoDB我正在尝试使用以下代码通过 Lambda 函数从 Kinesis 摄取数据 DynamoDB

AWS Kinesis Lambda DynamoDB我正在尝试使用以下代码通过 Lambda 函数从 Kinesis 摄取数据 DynamoDB

如何解决AWS Kinesis Lambda DynamoDB我正在尝试使用以下代码通过 Lambda 函数从 Kinesis 摄取数据 DynamoDB?

AWS Kinesis Lambda DynamoDB。我正在尝试使用以下代码通过 Lambda 函数从 Kinesis 流中将数据摄取到 DynamoDB。 但是数据没有在 DynamoDB 中被摄取,执行后在 lambda 函数中没有得到异常。 Lambda 函数已在 Kinesis Stream 上触发。

任何人都可以提出建议。

    import boto3
    import datetime
    import base64
    import json
    
    def lambda_handler(event,context):
        try:
            dynamo_db = boto3.resource(''dynamodb'')
            table = dynamo_db.Table(''table'')
            for record in event["Records"]:
                encoded = record["kinesis"]["data"]
                decoded = json.loads(base64.b64decode(encoded).decode("utf-8"))
                for i in decoded:
                    record = i["demo-stream"]
                    for j in record:
                        data = {
                            ''timestamp'': ["timestamp"],''name'': ["name"],''age'': ["age"]
                        }
                        # table.put_item(Item=data)  
                        with table.batch_writer() as batch_writer:
                            batch_writer.put_item(Item=data)
        except Exception as e: 
            print(str(e))

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

AWS Lambda 上的 Spring Boot 应用程序 - 使用 Docker 容器映像测量 Lambda 函数的冷启动和热启动部分

AWS Lambda 上的 Spring Boot 应用程序 - 使用 Docker 容器映像测量 Lambda 函数的冷启动和热启动部分

aws lambda 上的 spring boot 应用程序 - 使用 docker 容器映像测量 lambda 函数的冷启动和热启动部分

介绍

在如何使用 Docker 容器镜像和 Java (21) 运行时开发和部署 Lambda 函数一文中,我逐步介绍了如何使用 Docker 容器镜像和 Java 21 运行时开发和部署 Lambda 函数,而不使用任何框架。由于 Docker 容器镜像是通用格式,因此我们可以简单地采用使用 Spring Cloud Function AWS 开发应用程序一文中介绍的 Spring Cloud Function 应用程序,并使用相同的步骤进行部署。因此,我在此处发布了该应用程序的重新设计版本(添加 Dockerfle 并更改 SAM 模板)以将其部署为 Docker 映像。对于所有 Lambda 函数,我们使用 JAVA_TOOL_OPTIONS:“-XX:+TieredCompilation -XX:TieredStopAtLevel=1”(这在冷启动时间和热启动时间之间进行了合理的权衡)并为其提供 1024 MB 内存。使用 AWS Serverless Java Container 也可以实现同样的效果。

使用 Spring Cloud Function 和 Docker 容器镜像作为部署格式测量 Lambda 函数的冷启动和热启动

下面的实验结果基于使用 Lambda 函数 GetProductByIdWithSpringBootJava21DockerImage 在 1 小时内重现超过 100 次冷启动和大约 100.000 次热启动,该函数映射到负责检索产品(存储)的 Java Lambda 处理程序类在 DynamoDB 中)通过其 id。为此,我使用了负载测试工具,但是您可以使用任何您想要的工具,例如 Serverless-artillery 或 Postman。

冷 (c) 和暖 (m) 开始时间(以毫秒为单位):

c p50 c p75 c p90 c p99 c p99.9 c max w p50 w p75 w p90 w p99 w p99.9 w max
4558.68 4622.92 4749.37 5002.74 7183.64 7185.5 7.16 7.94 9.09 20.99 52.47 1313.08

结论

在本文中,我们使用 AWS Lambda 基础 Docker 容器映像的方法测量了 Lambda 函数的冷启动和热启动。与使用 Docker 容器映像和 Java (21) 运行时而不使用 Spring (Boot) 框架的 Lambda 函数进行测量相比,我们经历了更高的冷启动时间和略高的热启动时间,而且与使用 Spring Boot 的其他方法测量冷启动时间相比:本系列之前的文章中介绍了 AWS Serverless Java Container、AWS Lambda Adapter 和 Spring Cloud Functions。

AWS Lambda SnapStart 可显着缩短冷启动时间,目前仅适用于 Java Corretto 托管运行时(11、17 和 21),不适用于 Docker 容器映像。您可以探索 jlink 工具,将一组模块及其依赖项组装和优化为更小的自定义运行时映像和类数据共享 (CDS),但这有助于减少 Java 编程语言应用程序(特别是较小的应用程序)的启动时间,以及减少占地面积。使用 Docker 映像作为 Java 部署工件的优点是能够使用最新的 Java 运行时,例如将于 9 月发布的 Java 23。

以上就是AWS Lambda 上的 Spring Boot 应用程序 - 使用 Docker 容器映像测量 Lambda 函数的冷启动和热启动部分的详细内容,更多请关注php中文网其它相关文章!

AWS Lambda 函数在调用另一个 Lambda 函数时超时

AWS Lambda 函数在调用另一个 Lambda 函数时超时

如何解决AWS Lambda 函数在调用另一个 Lambda 函数时超时?

我有一个 Lambda 函数(触发器),它调用另一个 Lambda 函数(工作器)。两者都是用 Python 3.8 编写的。

调用是通过 boto3:

invokeResponse = lambdaClient.invoke(
            # FunctionName="worker_function",FunctionName="somearn",InvocationType="Event",LogType="Tail",Payload=payload,)

触发器脚本到达调用行,然后挂起直到超时(触发器测试长达 8 分钟)。 worker 函数可以手动测试成功,并在

两个脚本都在同一个 VPC 中,所以我认为这不是网络连接问题?

为了排除权限问题,我尝试授予触发器 AWSLambda_FullAccess,但仍然没有变化。

我错过了什么?

解决方法

我很生气。

我的头撞在这堵砖墙上好几个小时了。

原来我没有为 Lambda 添加 VPC 终端节点。

我认为把它全部写出来的行为可能让我有了一些清晰的认识。

已解决。

今天关于Java 8:Lambda-Streams,按方法进行过滤异常的分享就到这里,希望大家有所收获,若想了解更多关于-source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)、AWS Kinesis Lambda DynamoDB我正在尝试使用以下代码通过 Lambda 函数从 Kinesis 摄取数据 DynamoDB、AWS Lambda 上的 Spring Boot 应用程序 - 使用 Docker 容器映像测量 Lambda 函数的冷启动和热启动部分、AWS Lambda 函数在调用另一个 Lambda 函数时超时等相关知识,可以在本站进行查询。

本文标签: