Java 根据其他列表中的项目筛选流
尝试根据不同列表中的数据过滤流:Java 根据其他列表中的项目筛选流,java,for-loop,java-8,java-stream,Java,For Loop,Java 8,Java Stream,尝试根据不同列表中的数据过滤流: 它是有效的,但是我在流的中间使用 < /COD>循环。我找不到有关如何将for循环转换为流的任何信息 我可以只使用.stream()选择.getItems()而不是.forEach(),并拥有一个新的.stream()的DATA.accounts,但这是糟糕的代码,因为它必须在每个.forEach. y=1; DATA.accounts.stream() .flatMap(estimate -> e
它是有效的,但是我在流的中间使用<代码> < /COD>循环。我找不到有关如何将
for
循环转换为流的任何信息
我可以只使用.stream()
选择.getItems()而不是.forEach()
,并拥有一个新的.stream()
的DATA.accounts,但这是糟糕的代码,因为它必须在每个.forEach.
y=1;
DATA.accounts.stream()
.flatMap(estimate -> estimate.getElements().stream())
.filter( ele-> {
// different list;
for (Element element:selection.getItems()){
if (element.getId()==ele.getId()){
return true;
}
}
return false;
})
.forEach(element -> {
element.setDateSchedualed(selectedDate);
element.setOrder(y);
y++;
});
我认为如果您想在线性时间内搜索id,那么使用for-each循环实际上没有什么错,因为例如,如果您的项目列表是
ArrayList
,并且您使用它的contains
方法进行过滤,那么它实际上也会在元素上循环。您可以编写一个常规包含函数,如:
public static <E1, E2> boolean contains(Collection<E1> collection, E2 e2, BiPredicate<E1, E2> predicate){
for (E1 e1 : collection){
if (predicate.test(e1, e2)){
return true;
}
}
return false;
}
我认为你真正需要的是:
list1.removeAll(list2);
但不涉及流。将另一个列表的ID放入
集合selectedds
,然后根据ele->selectedds.contains(ele.getId())
进行筛选
这将给你(摊销)线性时间复杂度
由于您需要检查流中每个项目的
selected
中所有元素之间的存在性,因此我不希望有任何直接的方法只使用流(因为您无法真正流式处理此任务的selected
集合)。您可以将过滤器表达为
.filter(ele -> selection.getItems().stream()
.anyMatch(element -> element.getId()==ele.getId())
这一事实“将不得不重新整理”应该不会比原始代码将为每个元素循环更困扰您。在这两种情况下,您都创建了时间复杂度为O(n×m)
的操作。这是可以接受的,如果你可以肯定地预测这些列表中的一个总是非常小的
否则,无法通过将id值存储在具有快速(最好的情况下是O(1)
)查找的结构中来准备此操作。即
Set<IdType> id = selection.getItems().stream()
.map(element -> element.getId())
.collect(Collectors.toSet());
…
.filter(ele -> id.contains(ele.getId())
返回false
是否在for each for here的范围内?是否只想检查第一个元素?@Calculator不,不应该有错误。已编辑。事实上,对y
变量进行变异的代码根本不起作用,这应该比过滤器中的循环更麻烦…
Set<IdType> id = selection.getItems().stream()
.map(element -> element.getId())
.collect(Collectors.toSet());
…
.filter(ele -> id.contains(ele.getId())
Set<IdType> id = selection.getItems().stream().map(element -> element.getId());
List<ElementType> list = DATA.accounts.stream()
.flatMap(estimate -> estimate.getElements().stream())
.filter(ele -> id.contains(ele.getId())
.collect(Collectors.toList());
IntStream.range(0, list.size())
.forEach(ix -> {
ElementType element = list.get(ix);
element.setDateSchedualed(selectedDate);
element.setOrder(ix+1);
});