使用Java 8 JDK将Iterable转换为Stream

本文翻译自:Convert Iterable to Stream using Java 8 JDK

I have an interface which returns java.lang.Iterable<T> . 我有一个返回java.lang.Iterable<T>的接口。

I would like to manipulate that result using the Java 8 Stream API. 我想使用Java 8 Stream API处理该结果。

However Iterable can't "stream". 但是Iterable无法“流式传输”。

Any idea how to use the Iterable as a Stream without converting it to List? 任何想法如何将Iterable用作流而不转换为List?


#1楼

参考:https://stackoom.com/question/1cPoz/使用Java-JDK将Iterable转换为Stream


#2楼

You can easily create a Stream out of an Iterable or Iterator : 您可以使用IterableIterator轻松创建Stream

public static <T> Stream<T> stream(Iterable<T> iterable) {
    return StreamSupport.stream(
        Spliterators.spliteratorUnknownSize(
            iterable.iterator(),
            Spliterator.ORDERED
        ),
        false
    );
}

#3楼

There's a much better answer than using spliteratorUnknownSize directly, which is both easier and gets a better result. spliteratorUnknownSize直接使用spliteratorUnknownSize相比,有一个更好的答案,这既简单又得到更好的结果。 Iterable has a spliterator() method, so you should just use that to get your spliterator. Iterable具有spliterator()方法,因此您应该使用该方法来获取您的spliterator。 In the worst case, it's the same code (the default implementation uses spliteratorUnknownSize ), but in the more common case, where your Iterable is already a collection, you'll get a better spliterator, and therefore better stream performance (maybe even good parallelism). 在最坏的情况下,它是相同的代码(默认实现使用spliteratorUnknownSize ),但是在更常见的情况下,如果您的Iterable已经是一个集合,您将获得更好的分离器,从而获得更好的流性能(甚至可能具有良好的并行性) )。 It's also less code: 它的代码也更少:

StreamSupport.stream(iterable.spliterator(), false)
             .filter(...)
             .moreStreamOps(...);

As you can see, getting a stream from an Iterable (see also this question ) is not very painful. 如您所见,从Iterable获得流(也请参见此问题 )不是很痛苦。


#4楼

我想建议使用JOOL库,它在Seq.seq(iterable)调用后隐藏了分隔符魔术,并且还提供了许多其他有用的功能。


#5楼

I've created this class: 我创建了此类:

public class Streams {
    /**
     * Converts Iterable to stream
     */
    public static <T> Stream<T>  streamOf(final Iterable<T> iterable) {
        return toStream(iterable, false);
    }

    /**
     * Converts Iterable to parallel stream
     */
    public static <T> Stream<T> parallelStreamOf(final Iterable<T> iterable) {
        return toStream(iterable, true);
    }

    private static <T> Stream<T> toStream(final Iterable<T> iterable, final boolean isParallel) {
        return StreamSupport.stream(iterable.spliterator(), isParallel);
    }
}

I think it's perfectly readable because you don't have to think about spliterators and booleans (isParallel). 我认为它是完全可读的,因为您不必考虑分隔符和布尔值(isParallel)。


#6楼

如果您可以使用Guava库(从21版开始),则可以使用

Streams.stream(iterable)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值