Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用forEach()方法通过Java 8迭代AWS保留EC2实例?_Java_Amazon Web Services_Amazon S3_Amazon Ec2_Java 8 - Fatal编程技术网

如何使用forEach()方法通过Java 8迭代AWS保留EC2实例?

如何使用forEach()方法通过Java 8迭代AWS保留EC2实例?,java,amazon-web-services,amazon-s3,amazon-ec2,java-8,Java,Amazon Web Services,Amazon S3,Amazon Ec2,Java 8,我发现这段代码描述了AWSSDKforJava中的ec2实例。我需要使用forEach()方法将此代码段转换为Java 8。 我知道如何使用forEach()方法迭代单个列表。但我正在努力处理这段代码,因为它是嵌套的 DescribeInstancesRequest request = new DescribeInstancesRequest(); while(!done) { DescribeInstancesResult response = ec2.describ

我发现这段代码描述了AWSSDKforJava中的ec2实例。我需要使用
forEach()
方法将此代码段转换为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
,以供Java8进一步使用。有人能给我一个小费来满足我的要求吗?我们将不胜感激

下面是使用Java8流的代码

DescribeInstanceResult response = ec2.describeInstances(request);

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

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

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更加灵活

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

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

提示:您正在查找的
flatMap
findFirst
API。感谢您的回复!但是它给出了一个编译错误,
类型不匹配:无法从列表转换为流。我犯了一个小错误。我编辑了我的代码。你现在可以试试吗instanceId的类型应该是Instance吗?现在是什么问题。。否,因为我们从实例对象获取的instanceId是字符串。这就是您发布问题的原因,返回实例idIt会导致编译问题,
类型不匹配:无法从实例转换为字符串
。我对flatMap和FindFirstinStreamAPI完全陌生。我会研究的。目前,你能给我一个提示来解决这个问题吗?
private Optional<Instance> firstEC2Instance() {
  DescribeInstancesRequest request = new DescribeInstancesRequest();

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