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
}
//返回一个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;
}
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));
}
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));
}
1.4.3 使用toSet去重
//使用distinct去重
List<String> distinctMsg = list.stream().map(Message::getMsg).distinct().collect(Collectors.toList());
distinctMsg.forEach(System.out::println);
1.4.3 使用distinct去重
//使用collect(toSet())去重
Set<String> distinctMsg2 = list.stream().map(Message::getMsg).collect(toSet());
distinctMsg2.forEach(System.out::println);
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));
}
}
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));
}
}