【问题标题】:How to use forEach() method for iterating AWS Reserved EC2 Instances by Java 8?如何使用 forEach() 方法通过 Java 8 迭代 AWS 预留 EC2 实例?
【发布时间】:2020-01-22 17:10:23
【问题描述】:

我发现此代码用于描述 AWS SDK for java 中的 ec2 实例。我需要使用forEach() 方法将此代码sn-p 转换为Java 8。 我知道如何使用forEach() 方法来迭代单个列表。但我正在努力处理这段代码,因为它是嵌套的。

 DescribeInstancesRequest request = new DescribeInstancesRequest();
    while(!done) {
        DescribeInstancesResult response = ec2.describeInstances(request);

        for(Reservation reservation : response.getReservations()) {
            for(Instance instance : reservation.getInstances()) {
                    String instanceID = instance.getInstanceId(),
                    return instanceID;                    
            }
        }

我想要的是遍历所有实例并获取instanceID 以供 java 8 进一步使用。有人可以给我一个提示来满足我的要求吗?将不胜感激。

【问题讨论】:

  • 提示:您正在寻找StreamflatMapfindFirst API。

标签: java amazon-web-services amazon-s3 amazon-ec2 java-8


【解决方案1】:

这是使用 java 8 流的代码

DescribeInstanceResult response = ec2.describeInstances(request);

String instanceId = response.getReservations()
                            .stream()
                            .flatMap(reservation -> reservation.getInstances()
                                                               .stream())
                            .findFirst()
                            .orElse(null);

【讨论】:

  • 感谢您的回复!但它给出了一个编译错误,说Type mismatch: cannot convert from List<Instance> to Stream<? extends Object>。无论如何,我会尝试用你发布的这个 sn-p 来解决这个问题。
  • sry 我犯了一个小错误..我编辑了我的代码你现在可以试试吗
  • instanceId的类型应该是Instance吗?
  • 现在问题出在哪里.. 不,因为我们从实例对象中获取了实例 ID,它是字符串。这就是您发布问题的内容,返回实例 ID
  • 它给出了编译问题,Type mismatch: cannot convert from Instance to String。我对 flatMap 和 Stream API 中的 findFirst 完全陌生。我会研究那个。暂时,你能给我一个解决这个问题的提示吗?
【解决方案2】:

问题中的代码可以重构为使用OptionalStreamflatMap 而不是嵌套循环

private final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

private Optional<String> findFirstEC2InstanceId() {
  DescribeInstancesRequest request = new DescribeInstancesRequest();

  return ec2.describeInstances(request).getReservations()
            .stream()
            .map(Reservation::getInstances)
            .flatMap(Collection::stream)
            .findFirst()
            .map(Instance::getInstanceId);
}

该方法可以通过以下方式打印实例ID

findFirstEC2InstanceId().ifPresent(System.out::println);

返回Instance 对象而不是String ID 更加灵活

private Optional<Instance> firstEC2Instance() {
  DescribeInstancesRequest request = new DescribeInstancesRequest();

  return ec2.describeInstances(request).getReservations()
            .stream()
            .map(Reservation::getInstances)
            .flatMap(Collection::stream)
            .findFirst();
}

然后我们可以通过以下方式获取实例ID或任何其他数据

firstEC2Instance().map(Instance::getInstanceId).ifPresent(System.out::println);

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2013-11-22
    • 2022-01-14
    • 1970-01-01
    • 2022-11-01
    相关资源
    最近更新 更多