[英]Java 8 how to simplify for loop with lambda expressions
我的代码中有此方法,需要使用 java 8 表达式来简化和减少代码行。 Lambda 可用于此但如果没有列表作为输入似乎是不可能的。
public ResourceUsage[] filterResourceUsages(ResourceUsage[] resourceUsages, int role, int includeResourceType)
throws SpiderException
{
ArrayList<ResourceUsage> filteredResourceUsages = new ArrayList<>();
String[] ids = new String[resourceUsages.length];
for (int i = 0; i < resourceUsages.length; i++)
{
ids[i] = resourceUsages[i].resource;
}
ResourceData[] resourceData = resourceToolkitAdapter.getData(ids);
for (int i = 0; i < resourceData.length; i++)
{
if (resourceUsages[i].role == role && resourceData[i].basic.type == includeResourceType)
{
filteredResourceUsages.add(resourceUsages[i]);
}
}
return filteredResourceUsages.toArray(new ResourceUsage[filteredResourceUsages.size()]);
}
我试过使用resourceUsages.forEach(resourceUsages.resource-> do something);
但没有列表作为输入似乎是不可能的。
有什么办法可以简化这段代码吗?
这是原点 arrays 和批处理解决方案:
public ResourceUsage[] filterResourceUsages(ResourceUsage[] resourceUsages, int role, int includeResourceType)
throws SpiderException {
String[] ids = Stream.of(resourceUsages)
.map(ResourceUsage::getResource)
.toArray(String[]::new);
Map<String, ResourceData> resourceDataMap = Stream.of(resourceToolkitAdapter.getData(ids))
.collect(Collectors.toMap(ResourceData::id, Function.identity()));
return Stream.of(resourceUsages)
.filter(usage -> usage.role == usage)
.filter(resourceDataMap::containsKey)
.filter(usage -> resourceDataMap.get(usage.resource).basic.type == includeResourceType)
.toArray(ResourceUsage[]::new);
}
您可以使用 arrays 这样做
Arrays.stream(resourceUsages)
.forEach(e->System.out.print(e));
最好使用List<ResourceUsage>
而不是 arrays。
我还打算假装可以在每个资源上依次调用resourceToolkitAdapter.getData()
,而不是批量调用。
结果将是这样的:
public List<ResourceUsage> filterResourceUsages(List<ResourceUsage> resourceUsages, int role, int includeResourceType)
throws SpiderException
{
return resourceUsages.stream()
.filter(r->r.role == role)
.filter(r->resourceToolkitAdapter.getData(r.resource).basic.type == includeResourceType)
.collect(Collectors.toList());
}
与 Matthew 的回答相反,我认为resourceToolkitAdapter.getData()
应该用一批 id 来调用。
public ResourceUsage[] filterResourceUsages(ResourceUsage[] resourceUsages, int role, int includeResourceType)
throws SpiderException
{
ResourceData[] resourceData = resourceToolkitAdapter.getData(
Arrays.stream(resourceUsages)
.map(r -> r.resource)
.toArray(String[]::new)
);
return IntStream
.range(0, resourceData.length)
.filter(i -> resourceUsages[i].role == role )
.filter(i -> resourceData[i].basic.type == includeResourceType)
.mapToObj(i -> resourceUsages[i])
.toArray(ResourceUsage[]::new);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.