我如何使用Java流库简化这个过程?
我对Java流API不是很在行,但我很确定有某种方法可以通过使用lambda表达式简化上面的代码。如果能更好地理解它,那将是一个很大的帮助 一些注意事项:我如何使用Java流库简化这个过程?,java,java-stream,Java,Java Stream,我对Java流API不是很在行,但我很确定有某种方法可以通过使用lambda表达式简化上面的代码。如果能更好地理解它,那将是一个很大的帮助 一些注意事项: Issues和getSubtasks()正在返回Iterable类型。如果不存在包含“sometext”摘要的子任务,则将issue键添加到ids 我认为子任务大小检查至少是多余的,而且可能是危险的,如果它有可能在子任务存在时将大小估计为零但是,如果getsubtask()返回一些不容易流式传输的非集合,并且此estimateSize()调用
Issues和getSubtasks()正在返回Iterable类型。如果不存在包含“sometext”摘要的子任务,则将issue键添加到
ids
我认为子任务大小检查至少是多余的,而且可能是危险的,如果它有可能在子任务存在时将大小估计为零但是,如果getsubtask()
返回一些不容易流式传输的非集合,并且此estimateSize()
调用是必需的,那么这只会稍微改变一些情况:
issues.stream()
.filter(i -> i.getSubtasks().stream()
.noneMatch(s -> s.getSummary().contains("sometext")))
.map(Issue::getKey)
.forEach(ids::add);
issues.stream()
.filter(i->{
Spliterator split=i.getsubtask().Spliterator();
返回拆分。estimateSize()==0||
StreamSupport.stream(拆分,false)
.noneMatch(s->s.getSummary().contains(“sometext”);
})
.map(问题::getKey)
.forEach(id::add);
如果不存在包含“sometext”摘要的子任务,则将问题密钥添加到ids
我认为子任务大小检查至少是多余的,而且可能是危险的,如果它有可能在子任务存在时将大小估计为零但是,如果getsubtask()
返回一些不容易流式传输的非集合,并且此estimateSize()
调用是必需的,那么这只会稍微改变一些情况:
issues.stream()
.filter(i -> i.getSubtasks().stream()
.noneMatch(s -> s.getSummary().contains("sometext")))
.map(Issue::getKey)
.forEach(ids::add);
issues.stream()
.filter(i->{
Spliterator split=i.getsubtask().Spliterator();
返回拆分。estimateSize()==0||
StreamSupport.stream(拆分,false)
.noneMatch(s->s.getSummary().contains(“sometext”);
})
.map(问题::getKey)
.forEach(id::add);
您可以使用过滤器
删除不需要的元素,并映射
获取密钥,然后收集
到列表
issues.stream()
.filter(i -> {
Spliterator<Subtask> split = i.getSubtasks().spliterator();
return split.estimateSize() == 0 ||
StreamSupport.stream(split, false)
.noneMatch(s -> s.getSummary().contains("sometext"));
})
.map(Issue::getKey)
.forEach(ids::add);
您可以使用
过滤器
删除不需要的元素,并映射
获取密钥,然后收集
到列表
issues.stream()
.filter(i -> {
Spliterator<Subtask> split = i.getSubtasks().spliterator();
return split.estimateSize() == 0 ||
StreamSupport.stream(split, false)
.noneMatch(s -> s.getSummary().contains("sometext"));
})
.map(Issue::getKey)
.forEach(ids::add);
在您的示例中,我无法确定什么是可流化的,因此我将提供一个替代解决方案,它不需要流,但至少(如果不是更高效的话)是有效的。它只是使用了不同的技术,但本质上是相同的逻辑
- 如果大小为0,则超出for循环。然后,如果任何摘要包含文本,则外部循环将正常进行,否则,循环将在添加键后结束
在您的示例中,我无法确定什么是可流化的,因此我将提供一个替代解决方案,它不需要流,但至少(如果不是更高效的话)是有效的。它只是使用了不同的技术,但本质上是相同的逻辑
- 如果大小为0,则超出for循环。然后,如果任何摘要包含文本,则外部循环将正常进行,否则,循环将在添加键后结束
问题是什么类型的数据结构?getSubTasks()返回什么?提供更多关于您尝试执行的操作的书面细节并显示一些类会有所帮助。看起来您随时都在将
key
添加到ids
arraylist中time@Deadpool我不这么认为。如果大小>0且alreadyCreated
为true
,则不会添加它。压痕需要改进。是的。但是在数据类型等方面,我仍然对此有疑问。(issue.getSubtasks().spliterator().estimateSize()>0)
?我这样问是因为在检查之后,您迭代了乞讨问题的所有子任务,虽然它可能是合法的,但潜在的指标是可以优化的。问题是什么类型的数据结构?getSubTasks()返回什么?提供更多关于您尝试执行的操作的书面细节并显示一些类会有所帮助。看起来您随时都在将key
添加到ids
arraylist中time@Deadpool我不这么认为。如果大小>0且alreadyCreated
为true
,则不会添加它。压痕需要改进。是的。但是在数据类型等方面,我仍然对此有疑问。(issue.getSubtasks().spliterator().estimateSize()>0)
?我这样问是因为在那次检查之后,你迭代了乞讨过程中的所有子任务,虽然这可能是合法的,但潜在的指标是可以优化的。你不是在猜测吗?您如何知道getSubtasks()
是可流化的?它可以返回实现拆分器
接口的任何类。它不必是流。我想有可能getsubtask()
不是一个普通的旧集合。甚至有可能问题
不可流化。但是OP是专门询问流API的,因此假设事情是可流化的似乎是合理的。问题类型的唯一问题是“Iterable issues”,因此它在默认情况下是不可流化的,与getSubtasks:/@DavaLoper相同。请看是什么阻止您将此代码放入实用程序方法中?您猜不到吗?您如何知道getSubtasks()
是可流化的?它可以返回实现拆分器
接口的任何类。它不必是流。我想有可能getsubtask()
不是一个普通的旧集合。甚至有可能问题
不可流化。但是OP特别询问了stream API,因此假设事情是可流化的似乎是合理的。问题类型的唯一问题是“Iterable issues”,因此默认情况下它是不可流化的,与getSubtasks相同:/@DavaLoper查看是什么阻止您将此代码放入
outer:
for (Issue issue : issues) {
if (issue.getSubtasks().spliterator().estimateSize() > 0) {
for (Subtask subtask : issue.getSubtasks()) {
if (subtask.getSummary().contains("sometext")) {
continue outer;
}
}
}
ids.add(issue.getKey());
}
}