常用工具类
Collection工具类
常用方法如下:
ArrayList<String> list=new ArrayList<>();
list.add("g");
list.add("gdf");
list.add("jiu");
//添加元素
Collections.addAll(list, "c","a","b");
System.out.println("排序前:"+list);
//反转元素
Collections.reverse(list);
System.out.println("反转后:"+list);
//Sort按自然序列排序
Collections.sort(list);
System.out.println("自然排序:"+list);
//随机排列
Collections.shuffle(list);
System.out.println("按随机排列;"+list);
//位置元素交换
Collections.swap(list, 0, list.size()-1);
System.out.println("交换后:"+list);
查找,替换操作。
ArrayList<Integer>list1=new ArrayList();
Collections.addAll(list1, 1,2,6,3,-1,2);
System.out.println("集合中的元素为:"+list1);
System.out.println("最大元素为:"+Collections.max(list1));
System.out.println("最小元素为:"+Collections.min(list1));
Collections.replaceAll(list1, 2, 0);//将集合中的2都用0代替
System.out.println("替换后:"+list1);
//使用二分法查找元素的索引,前提是集合中的元素是有序的
Collections.sort(list1);
System.out.println("排序后:"+list1);
int index=Collections.binarySearch(list1, -1);
System.out.println("元素4所在的下标为"+index);
Arrays工具类(数组工具类)
sort() 用于给数组排序
binarySearch(Object[]a,b) 查找元素b在数组a中的索引
copyOfRange(int[]arr,a,b) 拷贝数组arr中从a(包括)位置到b位置(不包括)到一个新的数组中
fill(Object[]a ,b) 将数组a中的元素都用b替代
例子代码:
package 集合基础练习题;
import java.util.Arrays;
public class Array工具类 {
//定义一个输出方法
public static void maprintln(int[]arr) {
System.out.print("<");
for (int i = 0; i <arr.length; i++) {
if(i!=arr.length-1) {
System.out.print(arr[i]+",");
}else {
System.out.print(arr[i]+">");
}
}
}
public static void main(String[] args) {
int[]arr={ 9,3,34,5,1};
System.out.print("排序前:");
maprintln(arr);
Arrays.sort(arr);
System.out.println(" ");
System.out.print("排序后:");
maprintln(arr);
/*binarySearch(Object[] a,Object key),因为该方法是使用二分法查找的
* ,所以查找之前先要排序
*/
Arrays.sort(arr);
int index =Arrays.binarySearch(arr, 3);
System.out.println("元素3的索引为:"+index);
//通过copyOfRange()方法可以将初始位置(包括),末位置(不包括)拷贝到一个新的数组中
int[]newarr=Arrays.copyOfRange(arr, 2,4);
for (int i = 0; i < newarr.length; i++) {
System.out.print(newarr[i]+" ");
}
//fill()方法可以将数组中的所有元素用一元素替代
Arrays.fill(arr, 6);
System.out.println("用6替换后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
聚合操作
聚合操作:说白了就是JDk新增的一个Stream接口,该接口可以将集合,数组中的元素转换为Stream流的形式,并结合Lambda表达式的优势来进一步简化集合,数组中元素的查找,过滤,转换等操作,也就称之为聚合操作。
创建Stream流对象的三种方式:
具体操作为:
注意Arrays工具类中的asList()方法可以将数组转换为List集合
//创建一个数组
Integer[]array= {8,3,4,5,6,2};
//将数组转换为List集合
List<Integer>list=Arrays.asList(array);
//1.使用集合对象的stream()静态方法创建Stream流对象
Stream<Integer>stream=list.stream();
stream.forEach(i->System.out.println(i));
System.out.println( );
//2.使用Stream接口的of()静态方法创建stream流对象
Stream<Integer>stream2=Stream.of(array);
stream2.forEach(j->System.out.println(j));
System.out.println( );
//3.使用Arrays数组工具类的stream()静态方法创建Stream流对象
Stream<Integer>stream3=Arrays.stream(array);
stream3.forEach(o->System.out.println(o));
Stream流对象的常用方法
1.遍历
Stream<String>stream=Stream.of("张三","李四","王五","赵六");
//方法一:利用forEach循环
stream.forEach(i->System.out.println(i));
//方法二:forEach循环的变形版
//stream.forEach(System.out::println);
//这两种遍历方式只能单独一种执行,不能同时执行,否则报错
2,过滤
Stream <String>stream=Stream.of("张三","张晓芬","张思","张山峰","张丽","王磊") ;
stream.filter(i->i.startsWith("张"))
.filter(i->i.length()>2)
.forEach(System.out::println);
3.映射
注意Stream流对象中排序方法为sorted()
映射代码:
Stream<String>stream=Stream.of("a","b1","d","b4","a1");
stream.filter(i->i.startsWith("b")) //筛选出以b开头的元素
.map(String::toUpperCase) //对流元素进行映射,将全部字符改成大写
.sorted().forEach(System.out::println);
4.截取
截取过程中通常会使用skip()和limit()方法
Stream<String>stream=Stream.of("张三","张晓芬","张思","张山峰","张丽","王磊");
stream.skip(2) //跳过前面两个元素
.limit(3) //截取流中的前面3个元素
.forEach(System.out::println);
5.收集
终结操作的概念:我个人觉得就是程序结束的操作。
像forEach()也是一种结束操作,但是它无法将进行中间操作后的流元素作为我们熟悉的对象或者数据类型进行保存。不过collect可以。
Stream<String>stream=Stream.of("张三","张晓芬","张思","张山峰","张丽","王磊");
//通过collect()方法进行终端操作,再将元素收集到一个List集合中。
List<String>list=stream.filter(i->i.startsWith("张"))
.collect(Collectors.toList());
Stream<String>stream1=Stream.of("张三","张晓芬","张思","张山峰","张丽","王磊");
//通过collect()方法进行终端操作,再将元素使用"and"连接收集到一个字符串中。
String string=stream1.filter(j->j.startsWith("张"))
.collect(Collectors.joining("and"));
Parallel Stream(并行流)
Stream流对象是一种串行流,所谓串行流就是将源数据转换为一个流对象,然后在单线程下执行聚合操作的流(也就是单一管道流)
并行流:就是将源数据分为多个子流对象进行多线程操作,然后将处理的结果再汇总成一个流对象。
注意Stream被创建时都被默认为串行流。
并行流的创建:
List<String>list=Arrays.asList("张三","张晓芬","张思","张山峰","张丽","王磊");
//方法一:直接使用Collection接口的parallelStream()创建并行流
Stream<String>parallelstream=list.parallelStream();
System.out.println(parallelstream.isParallel());
//方法二:使用BaseStream接口的parallel()方法将Stream串行流转变为并行流
Stream<String>parallel=stream.parallel();
System.out.println(parallel.isParallel());