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

2022-09-04 03:18:55

我试图从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();
    }
  }
);

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

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

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

答案 1

您可以使用以下命令实现为功能接口:IterableStream.iterator()

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

答案 2

推荐