Java8集合List排序、筛选

1. List

元素有序

元素可重复

1.1 ArrayList

动态数组实现

查询快

增删慢(末尾处也快)

1.2 LinkedList

链表实现

查询慢

增删快

1.3 ArrayList和LinkedList比较

实现

查询

增删

线程安全?

ArrayList

动态数组


慢(末尾处也快)

不安全

LinkedList

链表



不安全

ArrayList:

它的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为原来的1.5倍。

LinkedList:

底层实现是双向链表。

在增加和删除元素时效率较高。

1.4 List过滤指定元素

1.4.1 准备待测试的List

public class Message {
  private Long id;  //id
 
  private String msg; //消息
 
  private Date sendTime; //时间戳
  //省略get set
}

Java8集合List排序、筛选、求和、求最大值、平均值、List转Map_List

//返回一个List
private static List<Message> getMessageList(){
    List<Message> list = new ArrayList<>();
    list.add(new Message(1L, "a", new Date()));
    list.add(new Message(2L, "b", new Date()));
    list.add(new Message(4L, "b", new Date()));
    list.add(new Message(3L, "c", new Date()));
    return list;
  }

Java8集合List排序、筛选、求和、求最大值、平均值、List转Map_java8_02

 1.4.2 使用Iterator遍历List

private static void TestArrayList(){
    List<Message> list = getMessageList();
    System.out.print("删除前:");
    list.stream().forEach(item -> System.out.print(item));
 
    Iterator<Message> it = list.iterator();
    while (it.hasNext()) {
      Message s = it.next();
      if (s.getMsg().equals("b")) {
        it.remove();
      }
    }
 
    System.out.print("\n删除后:");
    list.stream().forEach(item -> System.out.print(item));
}

Java8集合List排序、筛选、求和、求最大值、平均值、List转Map_升序_03

 1.4.2 使用Java8对List过滤筛选

private static void filterList(){
  List<Message> list1 = getMessageList();
  //过滤所有msg是b的记录
  List<Message> list2 = list1.stream().filter(s -> !s.getMsg().equals("b")).collect(Collectors.toList());
  list2.stream().forEach(item -> System.out.println(item));
}

Java8集合List排序、筛选、求和、求最大值、平均值、List转Map_java8_04

1.4.3 使用toSet去重

//使用distinct去重
 
List<String> distinctMsg = list.stream().map(Message::getMsg).distinct().collect(Collectors.toList());
distinctMsg.forEach(System.out::println);

Java8集合List排序、筛选、求和、求最大值、平均值、List转Map_List_05

 1.4.3 使用distinct去重

//使用collect(toSet())去重
Set<String> distinctMsg2 = list.stream().map(Message::getMsg).collect(toSet());
distinctMsg2.forEach(System.out::println);

Java8集合List排序、筛选、求和、求最大值、平均值、List转Map_List_06

 1.5 使用Java8对List排序

private static void sortList(){
   List<Message> list = getMessageList();
   if (list != null && !list.isEmpty()){
     System.out.println("===排序前如下===");
     list.stream().forEach(item -> System.out.println(item));
 
     //根据Id升序排序
     list.sort((a, b) -> a.getId().compareTo(b.getId()));
 
     //根据Id升序排序(简写)
     list.sort(Comparator.comparing(Message::getId));
 
     //根据Id降序排序(简写)
     list.sort(Comparator.comparing(Message::getId).reversed());
      
     System.out.println("===排序后如下===");
     list.stream().forEach(item -> System.out.println(item));
   }
 }

Java8集合List排序、筛选、求和、求最大值、平均值、List转Map_List_07

1.5.2 多个字段组合排序

private static void sortList(){
  List<Message> list = getMessageList();
  if (list != null && !list.isEmpty()){
    System.out.println("===排序前如下===");
    list.stream().forEach(item -> System.out.println(item));
 
    //根据多条件组合排序,先根据msg(升序),再根据id(升序)
    list.sort(Comparator.comparing(Message:: getMsg).thenComparing(Message::getId));
 
    //根据多条件组合排序,先根据msg(升序),再根据id(降序)
    list.sort(Comparator.comparing(Message:: getMsg).thenComparing(Comparator.comparing(Message::getId).reversed()));
 
    //根据多条件组合排序,先根据msg(降序),再根据id(降序)
    list.sort(Comparator.comparing(Message:: getMsg).thenComparing(Message::getId).reversed());
 
    //根据多条件组合排序,先根据msg(降序),再根据id(升序)
    list.sort(Comparator.comparing(Message:: getMsg).reversed().thenComparing(Message::getId));
 
    System.out.println("===排序后如下===");
    list.stream().forEach(item -> System.out.println(item));
  }
}

Java8集合List排序、筛选、求和、求最大值、平均值、List转Map_List_08