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