集合和流虽然具有一些相似性,但有不同的目标。 集合主要是对其中的元素进行管理和访问。 而流不提供直接访问或操纵其元素的功能, //流的出现只是对集合中的元素进行声明性地描述或对元素进行计算等操作。 //而且流只能进行一次操作,即调用非终结方法或终结方法操作一次。 所以对流操作完成之后,有时需要将其结果进行收集,获取对应的集合、数组等。
收集到集合中
Stream 流提供 collect 方法, 其参数需要一个 java.util.stream.Collector接口对象来指定收集到哪种集合中。 java.util.stream.Collectors 类提供一些方法,可以作为 Collector 接口的实例: Collectors 类提供一些方法 说明 public static Collector> toList() 转换为 List 集合 public static Collector> toSet() 转换为 Set 集合
收集到集合的示例
案例需求:将一个字符串组成的流对象,调用 collect 方法,分别转成 List 和 Set 集合。
注意:流只能收集一次
案例代码:
public static void main(String[] args) { Stream<String> stream = Stream.of("10", "20", "30", "40", "50"); //只能收集 1 次 // List<String> collect = stream.collect(Collectors.toList()); // System.out.println(collect); Set<String> stringSet = stream.collect(Collectors.toSet()); System.out.println(stringSet); }
收集到数组中
Stream接口中定义的方法 Object[] toArray() 返回一个包含流中元素的数组,返回值类型是Object[]的数组
收集到数组的示例
将一个流转成Object数组
public void testCollectArray() { Stream<String> stream = Stream.of("Jack","Rose","Hello","Select","Insert"); //转成一个Object数组 Object[] objects = stream.toArray(); for (int i = 0; i < objects.length; i++) { System.out.println(objects[i]); } }
Stream接口中定义的方法 A[] toArray(IntFunction<A[]> generator) 返回包含此流元素的数组,使用提供的生成器函数分配返回的数组
有了Lambda和方法引用之后,可以使用toArray方法的另一种重载形式传递一个IntFunction<A[]>的函数,
继而从外面指定泛型参数。这是IntFunction接口的源代码:
public interface IntFunction<R> { /** * 使用给定的整数变量,通过函数计算出结果 */ R apply(int value); }
IntFunction接口中的方法:
R apply(int value) 传入一个整数变量,得到另一种类型的结果。类似于Function的接口,甚至更简单。 IntFunction的R apply(int value)方法只能传入整数,而Function的R apply(T t)方法可以传入任意类型。
案例说明:
1) 创建一个由字符串组成的流
2) 调用toArray()方法生成一个String[]数组。
3) 使用Lambda和数组方法引用的写法分别写出来
4) 输出转换后的数组
public void testCollectArray() { Stream<String> stream = Stream.of("Jack","Rose","Hello","Select","Insert"); /*//转成一个Object数组 Object[] objects = stream.toArray(); for (int i = 0; i < objects.length; i++) { System.out.println(objects[i]); }*/ //R apply(int value), n表示数组的长度 //String[] strings = stream.toArray(n -> new String[n]); String[] strings = stream.toArray(String[]::new); for (String string : strings) { System.out.println(string); } }