如何用Streams替换Iterables.filter()?

yeg*_*256 10 java guava java-8 java-stream

我正在尝试从Guava迁移到Java 8 Streams,但无法弄清楚如何处理iterables.这是我的代码,从iterable中删除空字符串:

Iterable<String> list = Iterables.filter(
  raw, // it's Iterable<String>
  new Predicate<String>() {
    @Override
    public boolean apply(String text) {
      return !text.isEmpty();
    }
  }
);
Run Code Online (Sandbox Code Playgroud)

注意,这是一个Iterable,而不是一个Collection.它可能包含无限量的项目,我无法将其全部加载到内存中.什么是我的Java 8替代品?

顺便说一下,使用Lamba,这段代码看起来会更短:

Iterable<String> list = Iterables.filter(
  raw, item -> !item.isEmpty()
);
Run Code Online (Sandbox Code Playgroud)

shm*_*sel 9

您可以Iterable使用Stream.iterator()以下方法实现功能接口:

Iterable<String> list = () -> StreamSupport.stream(raw.spliterator(), false)
        .filter(text -> !text.isEmpty())
        .iterator();
Run Code Online (Sandbox Code Playgroud)

  • @yegor256 仔细阅读。或者试试看。 (2认同)
  • 明白了,我的错。谢谢! (2认同)
  • @AndrewTobilko OP表示它可能是一个无限的流.无论哪种方式,使用收集器将是性能成本. (2认同)
  • @shmosel:没有对你的答案提出异议......但是人们认为他们想要做的并不总是一个好主意.编辑:注意,我认为有很多情况下从Guava迁移到Streams是一个好主意...... Stream API很棒,我们通常会推荐它们.但是这个特定的情况("Iterable" - >"Iterable"过滤)是他们没有直接覆盖的东西,在我看来,这里的可读性有明显的损失. (2认同)