java8 Stream-创建流的几种方式

前面(《java8 Stream接口简介》),我们已经对stream这个接口,做了简单的介绍,下面,我们用几个案例,来看看流的几种创建方式

                String[] dd = { "a", "b", "c" };
		Arrays.stream(dd).forEach(System.out::print);// abc
		System.out.println();
		Stream.of(dd).forEach(System.out::print);// abc
		System.out.println();
		Arrays.asList(dd).stream().forEach(System.out::print);// abc
		System.out.println();
		Stream.iterate(0, x -> x + 1).limit(10).forEach(System.out::print);// 0123456789
		System.out.println();
		Stream.generate(() -> "x").limit(10).forEach(System.out::print);// xxxxxxxxxx

1.Arrays.stream,我们可以通过Arrays的静态方法,传入一个泛型数组,创建一个流

2.Stream.of,我们可以通过Stream的静态方法,传入一个泛型数组,或者多个参数,创建一个流,这个静态方法,也是调用了Arrays的stream静态方法,如下

  @SafeVarargs
    @SuppressWarnings("varargs") // Creating a stream from an array is safe
    public static<T> Stream<T> of(T... values) {
        return Arrays.stream(values);
    }

3.Collection.stream,可以用过集合的接口的默认方法,创建一个流;使用这个方法,包括继承Collection的接口,如:Set,List,Map,SortedSet 等等,详细的,可以看Collection接口上的定义注释,如下

/**
 * @author Josh Bloch
 * @author Neal Gafter
 * @see Set
 * @see List
 * @see Map
 * @see SortedSet
 * @see SortedMap
 * @see HashSet
 * @see TreeSet
 * @see ArrayList
 * @see LinkedList
 * @see Vector
 * @see Collections
 * @see Arrays
 * @see AbstractCollection
 * @since 1.2
 */
public interface Collection<E> extends Iterable<E> {
	default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
}

4.Stream.iterate,是Stream接口下的一个静态方法,从名字也可以看出,这个静态方法,是以迭代器的形式,创建一个数据流,具体的静态方法定义如下:

 public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) {
        Objects.requireNonNull(f);
        final Iterator<T> iterator = new Iterator<T>() {
            @SuppressWarnings("unchecked")
            T t = (T) Streams.NONE;

            @Override
            public boolean hasNext() {
                return true;
            }

            @Override
            public T next() {
                return t = (t == Streams.NONE) ? seed : f.apply(t);
            }
        };
        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
                iterator,
                Spliterator.ORDERED | Spliterator.IMMUTABLE), false);
    }

静态方法定义以及代码中,可以看到,传入两个参数,一个泛型T对象,表示数据的起始,一个函数式接口UnaryOperator(不知道这个接口的,JAVA8 UnaryOperator接口,有详细介绍),从迭代器hasNext中,可以看到,返回一直为true,表示迭代器,会一直执行下去,创建的数据集合的值为泛型T对象;这样一直创建无限个对象的流,也成为无限流;

5.Stream.generate,也是stream中的一个静态方法,静态方法定义如下:

public static<T> Stream<T> generate(Supplier<T> s) {
        Objects.requireNonNull(s);
        return StreamSupport.stream(
                new StreamSpliterators.InfiniteSupplyingSpliterator.OfRef<>(Long.MAX_VALUE, s), false);
    }

从静态方法定义中,可以看到,传入一个函数式接口Supplier(不知道这个接口是什么意义的,可以移步这边,JAVA8 Supplier接口有详细介绍);这个静态方法,也是无限生成对象的集合流,也是一个无限流;

 

最后介绍下,1-3,是根据具体的数组或者集合对象,创建的流,在创建流之前,这些对象的大小(长度)已经确认,所以这个种方式的流,也被成为有限流,而4-5中,创建流的方式,是无限大小的流(generate 最大是Long.MAX_VALUE),也被成为无限流,那么我们不可能就这样放任对象被无限创建,直到内存溢出,这样的无限流,也是配合limit使用,指定这个流生成的元素的个数,对于无限流,下面再简单讲个案例,使用传统的方式和无限流的方式,创建一个固定大小的ArrayList,这样大家也会有比较清楚的认识;

应用场景:我们再做B端系统的时候,会遇到很多的统计类的需求,会用到百度的echarts插件,比如曲线图,在x抽,固定的况下(按月统计 1号-31号,或者按年统计1月-12月,或者按天24个小时的刻度),那么我就需要创建一个这个数组,或者集合,代码如下:

public static void main(String[] args) {
		System.out.println(buildList(100));
		System.out.println(buildIterate(100));
	}

	public static List<Integer> buildList(final int size) {
		List<Integer> list = new ArrayList<>(size);
		for (int i = 1; i <= size; i++) {
			list.add(i);
		}
		return list;
	}

	public static List<Integer> buildIterate(final int size) {
		return Stream.iterate(1, x -> ++x).limit(size).collect(Collectors.toList());
	}

可以看到,使用流,可以更加简便,也更加直观的表现出代码的功能

 

1.lambda表达式

《java8 Lambda表达式简介》

《java8 lambda表达式,方法的引用以及构造器的引用》

2.函数式接口

《java8 函数式接口简介》

《JAVA8 Function接口以及同类型的特化的接口》

《JAVA8 Consumer接口》

《JAVA8 Supplier接口》

《JAVA8 UnaryOperator接口》

《JAVA8 BiConsumer 接口》

3.stream接口操作

《java8 Stream接口简介》

《 java8 Stream-创建流的几种方式》

《JAVA8 stream接口 中间操作和终端操作》

《JAVA8 Stream接口,map操作,filter操作,flatMap操作》

《JAVA8 stream接口 distinct,sorted,peek,limit,skip》

《java8 stream接口 终端操作 forEachOrdered和forEach》

《java8 stream接口 终端操作 toArray操作》

《java8 stream接口 终端操作 min,max,findFirst,findAny操作》

《java8 stream接口终端操作 count,anyMatch,allMatch,noneMatch》

《java8 srteam接口终端操作reduce操作》

《java8 stream接口 终端操作 collect操作》

4.其他部分

《java8 Optional静态类简介,以及用法》

 

  • 14
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Java 8引入了Stream作为对集合操作的新机制,相比于传统的迭代方式Stream具有以下几点优点。 1. 函数式编程:Stream采用函数式编程的思想,更容易理解和使用。它提供了一种简洁且可读性强的方式来描述集合操作,避免了使用循环和条件语句的繁琐。 2. 简化代码:Stream可以使用一行代码实现对集合的操作,从而降低了代码的复杂度和冗余度。相比传统的for循环,Stream的代码更加精炼,使得代码更易于维护和重构。 3. 多线程处理:Stream具有内部迭代的特性,可以自动利用多核处理器的优势进行并行处理。在处理大量数据时,可以大大提高程序的执行效率,减少运行时间。 4. 延迟执行:Stream操作中的很多方法(如filter、map等)都是惰性求值的,只有在终止操作(如collect、count等)被调用时才会执行,这样可以避免无谓的计算,在一定程度上提高了性能。 5. 功能强大:Stream提供了丰富的操作方法,可以满足不同场景下的需求。例如,filter方法可以过滤集合中符合条件的元素;map方法可以对集合中的元素进行转换;reduce方法可以对集合中的元素进行汇总等。 综上所述,Java 8中的Stream具有函数式编程、简化代码、多线程处理、延迟执行和功能强大等优点。它是一种高效且易于使用的集合操作方式,可以提高程序的性能和可读性,同时也为开发人员带来了更多的便利和选择。 ### 回答2: Java 8中引入的Stream是对集合操作的一种新的抽象方式,具有以下优点: 1. 简化代码:Stream提供了一种更为简洁、优雅的方式来处理集合数据,它使用链式调用的方式,使得代码更易读、理解和维护。相比于传统的迭代循环,Stream可以通过一条语句实现相同的功能。 2. 提高效率:Stream支持并行处理,可以自动将数据分成多个区块并同时处理,以提高操作的并行度,从而提高处理大数据量时的效率。 3. 减少内存占用:使用Stream进行数据处理时,不需要创建临时的集合来保存处理结果,因为Stream是惰性求值的,在需要结果时才进行计算,可以减少不必要的内存占用。 4. 支持函数式编程:Stream提供了一系列函数式操作,如filter、map、reduce等,可以对集合进行各种复杂的转换和处理。这种函数式编程的方式更符合现代编程的思维方式,使得代码更为简洁、灵活和可维护。 5. 轻松处理大数据量:Stream支持水线操作,可以将多个操作连接起来形成一个水线,每个操作都是串行处理数据的,可以轻松处理大数据量的情况,避免内存溢出的问题。 综上所述,Java 8中的Stream具有简化代码、提高效率、减少内存占用、支持函数式编程以及轻松处理大数据量等优点,大大提升了对集合数据的操作和处理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葵花下的獾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值