Java基础(2)——数组[] & 集合List,函数式编程Lamda表达式_java []和list(1)

39 阅读3分钟
    int a = 90;
    int b = 98;
    int c = 99;
    /\* 用数组存放多个值 \*/
    // 一维数组
    int[] scores = {90 , 98 , 99};
    int[] scores2 = {a , b , c};
    // \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*二维数组的基本概念和定义\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
    // 4、假设现在有3个班的学生成绩,使用一个数组该怎么存储(数据打包)?
    int[] class1 = {95,99,100};
    int[] class2 = {96,97,100};
    int[] class3 = {99,60,100};
    // 二维数组 - > 数组元素又是一个数组!
    // 三种写法:
    int[][] classz = { {95,99,100} , {96,97,100} , {99,60,100} };
    // int[][] clazz2 = {class1 ,class2 , class3 };
    int[][] clazz3 = new int[3][3]; // 3行3列 -》 场景 3个班级 , 每个班3个
    // 第二行第二列: 97
    System.out.println(classz[1][1]);

// 代码: 第三行第三列: 数组名[2][2] System.out.println(classz[2][2]); System.out.println(classz[classz.length - 1][2]); // ********************************************二维数组的应用********************************************************** // 使用循环遍历二维数组 for (int i = 0; i < classz.length; i++) { int[] scroes = classz[i]; // 从某个班取出该班所有的学生成绩 for (int j = 0; j < scroes.length; j++) { System.out.print(scroes[j] + "\t"); } System.out.println(); } System.out.println("------------------写法二"); for (int i = 0; i < classz.length; i++) { for (int j = 0; j < classz[i].length; j++) { System.out.print(classz[i][j] + "\t"); } System.out.println(); } // 三维 ... ...... int[][][] aaa; int[][][][] bb; int[][][][][][][][][][] ccc = new int[5][5][5][5][5][5][5][5][5][5]; } }


## 二、集合List


集合的底层数组,List提供了快捷的方法进行操作


![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/294e819889794dddbde78572aa68c8bd~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771132896&x-signature=yR7c%2FY2R6AtJ4cM3MbWa1HXbDSM%3D)


### 1.常用方法,增删取


ArrayList adminList = new ArrayList(); //用list保存员工信息


1)add  
 adminList.add(admin)


2get(下标)  
 adminList.get(i)


3remove()  
 adminList.remove(i); // 根据索引删除


4clear()  
 清除元素



System.out.println(5>3 || 10/0 > 4);


### 2.ArrayList和LinkedList


* ArrayList 空间是连续的,List的内容需要一个挨着一个;
* LinkedList 存储空间不需要连续,需要有指向,指向下一个元素


### 3.forEach方法



list.forEach(System.out::println);


![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b5c9f78acc364625a823b2838f54b076~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771132896&x-signature=8k3lXnxtRE6dX4637RCcwyuen9I%3D)


## 三、List的扩展


### 1.深入理解List【重要】


![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/4a86407202fb4cdaa21ee6dc504e37c5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771132896&x-signature=AjKrkiIQVcg9tpbWqshHRclz7lU%3D)



> 
> List接口>>>Collection接口(定义了add等方法)>>>Iterbale(iterator()迭代器)
> 
> 
> 


* 是一个动态数组 :transient Object[] elementData;
* 数组的默认长度为10:private static final int DEFAULT\_CAPACITY = 10;
* 扩容方案,原长度的1.5倍:int newCapacity = oldCapacity + (oldCapacity >> 1);
* 初始化较大的空间,防止重复扩容:list = new ArrayList<>(100);


### 2.删除元素的问题【重要】


* 用索引删除会出现问题
* 用迭代器的特性删除Iterator it = list.iterator();



// 初始化一个100大小的List,随机放1-100的数字,删除能被2,3,5整除的数 List list = new ArrayList<>(100); for(int i=1;i<=100;i++){ list.add(i); } Iterator it = list.iterator(); while (it.hasNext()){ //判断有没有下一个元素 int t = it.next(); //拿出下一个元素 if(t%2==0|| t%3==0||t%5==0){ it.remove(); } } System.out.println(list);


## 四、list.remove(对象)


* 需要对象实现equals()方法;可选实现hashCode()方法,用来快速定位对象


### 1.类实现equals和hashCode方法


equals方法必须,hashCode非必须;  
 只需要比较older类里的id或者identity,如果任一相等就能删除



@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Older older = (Older) o;
    return Objects.equals(id, older.id) || Objects.equals(identity, older.identity); // id相等或者identity相等就能删
}

@Override
public int hashCode() {
    return Objects.hash(id, identity);
}

方法的实现



@Override
public void deleteById(String id) {
    // id 为null 和 ""
    if (Objects.isNull(id) || "".equals(id)) {
        System.out.println("401异常,id为空...");
        return;
    }
    Older newOlder = new Older();
    newOlder.setId(id); // 只要ID相等就能删除,取决于上面类里面的equals方法
    boolean removeFlag = list.remove(newOlder); // 根据对象删除,返回True和false
    if (!removeFlag) {
        System.out.println("402异常,未找到该对象,删除失败...");
    } else {
        System.out.println("成功删除编号为" + id + "的老人信息");
    }
}

## 五、函数式编程—lamda表达式


![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b36285cfd01b4c078cd256995ab8db0c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771132896&x-signature=65uzSnILnB07vb9ZuhRdBQpxvrU%3D)


@FunctionalInterface


出现在接口,则此接口可以使用lamda表达式  
 ![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c01b22a9809f4777b8c1a991e6ecb3e9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1771132896&x-signature=yX9MVocSEfDL8wHnX3vs01gSBE8%3D)  
 表达式示例:



List ageList = list.stream() // 流对象 .filter(older -> (30 < older.getAge() && older.getAge() < 80)) // 过滤条件 .collect(Collectors.toList()); // 回收结果


### 1.排序



#### int格式排序



List sortByAge = list.stream() .sorted((o1, o2) -> o2.getAge() - o1.getAge()) // 降序 .collect(Collectors.toList());


#### BigDecimal排序



List sorted = list.stream() .sorted((o1, o2) -> o1.getPrice().compareTo(o2.getPrice())) // 升序 .collect(Collectors.toList());


#### Date类型排序



List sorted = list.stream() .sorted((o1, o2) -> o1.getProductionDate().compareTo(o2.getProductionDate())) .collect(Collectors.toList());



Collections.sort(list, (o1, o2) -> o1.getProductionDate().compareTo(o2.getProductionDate()));


### 2.limit:限制数量


需求:找出年龄最低的5个



List limitTwo2 = list.stream() .sorted((o1, o2) -> o2.getAge()-o1.getAge()) .limit(2) // 放在排序后面,限制数量 .collect(Collectors.toList());



List sortByAge = list.stream() .sorted((o1, o2) -> o2.getAge() - o1.getAge()) .collect(Collectors.toList()); System.out.println("找出年龄最大的2个人"); // subList 方法 System.out.println(sortByAge.subList(0, 2));


### 3.最大最小


需要用get()获取



System.out.println("最大值"+ list.stream() .max((o1, o2) -> o1.getAge()-o2.getAge()) .get()); // 需要用get()方法回收


### 4.filter:过滤


找到所有的偶数



List numbers = Arrays.asList(1,2,3,4,5,9,6,43,3); List newNum = numbers.stream() .filter(integer -> integer % 2 == 0) .collect(Collectors.toList()); System.out.println(newNum);


### 5.distinct:去重



#### StringBuilder去重



List allChildJob = list.stream() .map(o -> o.getChildJob()) // map 获得某个属性值 .collect(Collectors.toList()); List result = allChildJob.stream() .map(StringBuilder::toString) // map 将StringBuilder变成String .distinct() // 进行去重 .collect(Collectors.toList());


### 6.求和



#### int类型求和



// 把所有年龄找出来求和,计算平均值 System.out.println(list.stream() .mapToInt(older->older.getAge()) // 获取年龄 .sum());


#### BigDecimal求和



list.stream() .map(older -> older.getSal()) .reduce(BigDecimal.ZERO,BigDecimal::add) // 用reduce求和