如何使用forEach()方法通过Java 8迭代AWS保留EC2实例?
我发现这段代码描述了AWSSDKforJava中的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
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);