mapToXXX
IntStream mapToInt(ToIntFunction<? super T> mapper)
LongStream mapToLong(ToLongFunction<? super T> mapper)
DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper)
这三个方法除了对应返回三种指定类型的stream外其他使用方法和作用和map类似,相当于map方法的特例。
现在就一mapToInt为例进行说明,看例子:
1 | void stream_mapToInt() { |
上面代码使用mapToInt方法统计集合中个元素的字符长度,统计结果保存在IntStream流中返回,该流中只能包含int类型数据,map方法也能达到同样的目的,看代码:list.stream().map(a -> a.length()).forEach(System.out::println);
该代码直接结果和上面一样,区别就在于保存统计结果的流的类型不一样,map返回的是Stream
toArray
Object[] toArray()
A[] toArray(IntFunction generator)
简单地说这个方法就是把流转为数组。要把流转为集合可以使用collect方法,把流转为数组就用toArray方法。
无参方法返回的时候一个Object对象数组,有参数的方法返回数组数据类型根据该方法参数函数定义的数据类型来确定。Generator函数用来生成一个数组数据类型。
看例子:
1 | void stream_toArray() { |
第一行代码,通过of方法直接生成一个流,然后直接toArray,返回的肯定是Object类型的数组,不论流中保存的是什么类型的元素都是返回Object类型数组。
第二行代码,这里使用IntStraem的of方法生成的是IntStream流,然后使用toArray方法返回的就是int类型的数组,LongStream和DoubleStream也可以生成确定数据类型的数组。
第三行代码,其实就是通过mapToLong方法把普通流转化为LongStream。
上面示例中第一行代码,如果不想返回Object对象数组,我就想指定数组类型为String怎么办?看下面代码:
String[] strArray = Stream.of("aa","bb","cc").toArray(String[]::new);
这个时候就用到了带参数的toArray方法了,这个方法的参数可以指定返回数组的数据类型。
再来2个例子:
Integer[] intArray = Stream.of(12, 4, 4, 6, 10, 3, 6, 8, 9).toArray(Integer[]::new);
User[] userArray = Stream.of(new User("111@qq.com","北京"),new User("222@qq.com","shanghai")).toArray(User[]::new);
最后这个例子很直接的诠释了带参数toArray方法的重要性,就是我可以把任何数据类型的流转为以其相同数据类型的数组。
应用案例 LeetCode
349. 两个数组的交集
1 | class Solution { |
注意 int[] res = s2.stream().mapToInt(x -> x).toArray();
这行很方便的进行了转换!