使用与迭代器和String函数的连接

时间:2014-06-13 20:11:10

标签: java java-8

假设我有一个Iterator<Class1>对象。 Class1提供了一个返回stringFunction()的方法String

有没有办法在迭代器返回的每个String.join上调用stringFunction()的方式使用Class1,并连接由分隔符分隔的函数结果?

String.join重载需要Iterable<CharSequence>;是否可以从Iterator<Class1>stringFunction创建一个,以便join可以使用它?

3 个答案:

答案 0 :(得分:6)

如何使用

  • streamOfCharSequence.collect(Collectors.joining(delimiter))

而不是String.join(delimiter, Iterable<CharSequence>

您可以尝试类似

的内容
String result = StreamSupport
        .stream(Spliterators.spliteratorUnknownSize(iterator,
                Spliterator.ORDERED), false)
        .map(e -> e.stringFunction()).collect(Collectors.joining(", "));

答案 1 :(得分:4)

使用Guava,您应该能够做到这样的事情:

Iterator<Class1> iter = ...
String result = Joiner.on("//").join(Iterators.transform(iter, x -> x.stringFunction()));

答案 2 :(得分:1)

以下作品,但似乎有点笨重。

Iterator<Class1> iterator = ...;

Iterator<CharSequence> funcIterator = 
  StreamSupport.stream(
    Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
  .map(x -> (CharSequence)x.stringFunction())
  .iterator();

String result = String.join("//", () -> funcIterator);

创建Iterator<String>并不起作用,因为join没有 接受;因此,有必要将类型声明为 Iterator<CharSequence>,并将String投射到。{ lambda中的CharSequence。语法() -> idIterator适用于 创建一个Iterable,其迭代器是给定的迭代器。

有更简单的方法吗?