Как использовать метод forEach () для итерации AWS зарезервированных экземпляров EC2 по Java 8? - PullRequest
0 голосов
/ 17 января 2020

Я нашел этот код для описания экземпляров ec2 в AWS SDK для java. Мне нужно преобразовать этот фрагмент кода в Java 8, используя метод forEach(). Я знаю, как использовать 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. Может кто-нибудь дать мне совет, чтобы выполнить мое требование? Это будет высоко оценено.

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Вот код, использующий java 8 поток

DescribeInstanceResult response = ec2.describeInstances(request);

String instanceId = response.getReservations()
                            .stream()
                            .flatMap(reservation -> reservation.getInstances()
                                                               .stream())
                            .findFirst()
                            .orElse(null);
2 голосов
/ 21 января 2020

Код из вопроса может быть реорганизован для использования Optional, Stream и flatMap вместо вложенного l oop

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);
}

Этот метод можно использовать следующим образом: выведите идентификатор экземпляра

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();
}

Затем мы можем получить идентификатор экземпляра или любые другие данные, как показано ниже путь

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