【问题标题】:How to check if a Stream<String> contains another Stream<String> in Java 8如何在 Java 8 中检查 Stream<String> 是否包含另一个 Stream<String>
【发布时间】:2015-01-13 23:50:07
【问题描述】:

我创建了两个 Stream

Stream<String> first= ...
Stream<String> second= ...

他们都有数字。假设第一个文件有 1 到 1000,第二个文件有 25 到 35。我想检查第一个文件是否包含秒数。

first.filter(s-> !s.contains(second.toString())
     .collect(Collectors.toList());

如果我将second.toString() 替换为“10”,那么它可以工作,但我如何检查整个流,而不仅仅是一个字符或字符串?

【问题讨论】:

  • “包含流”是什么意思?您的意思是first 中的一个元素包含第二个中存在的每个字符串吗?第二个的每个元素都出现在第一个的某个地方?什么?
  • 这不是Stream 的好用例。如果流不是无限的(您无法真正检查),请将它们收集到 Sets 或 Lists 并与 containsAll 进行比较。
  • 我假设您的意思是“检测第一个中的哪些也在第二个中?”

标签: java functional-programming java-8 java-stream


【解决方案1】:

您需要收集second 流并将其所有值存储在一些经过调整的数据结构中。

例如使用Set:

Set<String> secondSet = second.collect(Collectors.toSet());
List<String> f = first.filter(s -> secondSet.contains(s))
                      .collect(Collectors.toList());

【讨论】:

  • 只是想知道.collect(Collectors.toList()) 的成本有多高。更广泛地说,MyClass.getCollection() 返回流以允许在不写入的情况下读取集合(在 MyClass 之外)是否有效。
【解决方案2】:
    List<String> first = new ArrayList<String>();
    List<String> second = new ArrayList<String>();

    for (Integer i = 0; i < 100; i++) {
        first.add(i.toString());
    }

    for (Integer i = 25; i < 36; i++) {
        second.add(i.toString());
    }   

    boolean result = second.stream().allMatch(
            value -> first.stream().collect(Collectors.toList()).contains(value));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多