【问题标题】:How to replace Iterables.filter() with Streams?如何用 Streams 替换 Iterables.filter()?
【发布时间】:2017-01-30 07:22:50
【问题描述】:

我正在尝试从 Guava 迁移到 Java 8 Streams,但不知道如何处理可迭代对象。这是我的代码,用于从可迭代对象中删除空字符串:

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

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

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

Iterable<String> list = Iterables.filter(
  raw, item -> !item.isEmpty()
);

【问题讨论】:

  • raw是什么类型?
  • 您使用的是哪个版本的 Guava?或者你根本不想使用 Guava?
  • @shmosel 如果可能的话,我想摆脱 Guava 并迁移到 Java 8 Streams。也许不是。这就是为什么在这里问。
  • 绝对不可能将 Guava 的所有实用程序都替换为流,但您可以替换此特定功能,如我的回答所示。

标签: java java-8 java-stream guava


【解决方案1】:

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

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

【讨论】:

  • @yegor256 请仔细阅读。或者试试看。
  • 明白了,我的错。谢谢!
  • @AndrewTobilko OP 表示它可能是无限流。无论哪种方式,使用收集器都会产生性能成本。
  • @ColinD 当您认为 OP 正在“尝试从 Guava 迁移到 Java 8 Streams”时,这很明显。
  • @shmosel:不接受你的回答……人们认为他们想做的事情并不总是一个好主意。编辑:注意,我确实认为在很多情况下从 Guava 迁移到 Streams 是一个好主意...... Stream API 很棒,我们通常推荐它们。但是这种特殊情况(Iterable -> Iterable 过滤)并没有被它们直接覆盖,在我看来,这里的可读性明显下降。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2019-11-24
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多