一、前言
我们都知道,在Java中String是不可变的;
但是很多时候,我们都需要对接收到的String进行处理,有些数据是通过一些分隔符来进行分割的;
这个时候往往就需要对分割后的数据进行批量处理,而这个时候往往是大坑的出现
二、Java中的批量处理方式
第一种:for i
//格式如下
for(int i=0;i<n;i++){
//do something
}
这种遍历方式是最简单的也是最不容易出错的,但是最麻烦的地方就在于需要在for循环内,使用[i]来获取对应的数据,使用起来还是比较麻烦的;
第二种 增强for
//格式如下
int[] list=new int[10];
for(int i: list){
//do something
}
这种遍历方式,是对于for的增强,可以不用考虑数组或list的长度,使用起来也比较清晰,而且在循环内,也比较好处理;
但在这里就出现了天坑:
这边的方式相当于从list中拿出数据,赋值给了变量i,和其他遍历方式不同的是,其他遍历方式可以拿到list中数据的引用,也就是可以修改对应数据引用的指向,而这种方式却拿不到;
所以这种方式在批量处理数据的时候,只能处理引用内容可变,或者是对象这样的数据,而如果处理String这样的不可变的内容,那么它就不会生效
第三种方式forEach
//格式如下
int[] list=new int[10];
Arrays.asList(list).forEach(
//do someting 一般可以写lambda表达式来处理对应的数据
);
这种遍历方式适合喜欢使用lambda表达式的人,虽然可读性有缩下降,但如果大家都喜欢用lambda表达式反而看起来比较清晰;
但这种方式和上面那种方式一样,无法修改不可变的数据,在这里处理,无法对不可变的数据进行生效,而且这种方式也不会修改对应的引用,所以只能修改引用指向的值,但值不可变,所以也就无法改变
第四种方式:stream流式处理
//格式如下
String str = "123,12312 ,1231 ,1231123 ";
List<String> collect = Arrays.stream(StringUtils.split(str,","))
.map(String::trim)
.collect(Collectors.toList());
这种方式看起来比较麻烦,而且可读性也很差,但却是可以批量处理不可变数据类型的,相较于前面几种可以很便捷的写错流式处理,操作性很高,但缺点是写出来的代码长度很长,对于不太熟悉的人来说,不容易看懂和理解;
stream看起来麻烦在于需要对数据进行多次方法调用,最后还必须回收才能使用;相较于前面的几种,stream可以做的事情非常多,还可以通过filter来过滤掉数据,经过多次处理(但要切记,流式处理之后,不可逆,只能继续下去),最后得到想要的结果;
写在最后
为什么没有迭代器呢?这是因为在实际使用种,迭代器的使用非常的少,所以在这里就不对迭代器进行说明了
以上的四种方式,stream的优先级最高,其他的可以根据你的需要来选择;
那么什么时候不选stream呢?其实在我看来你没有理由不选stream,而且大多数场景下,stream的流式处理可扩展性也更高,改动也比较小;
而其他的几种方式fori其实大部分情况是不会使用的,增强for一般用来遍历输出,而forEach这种方式,一般用来简单操作对象,比如批量初始化之类的;