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

时间:2017-01-30 07:22:50

标签: java java-8 java-stream guava

我正在尝试从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();
    }
  }
);

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

BTW,使用Lamba,这段代码看起来会更短:

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

1 个答案:

答案 0 :(得分:8)

您可以使用Iterable实现Stream.iterator()作为功能界面:

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