1. 转Map
List<Book> books = bookMapper.list();
Map<String, Book> bookMap = books.stream().collect(Collectors.toMap(Book::getBookId, book -> book));
注意不要重复key值,否则将报 Duplicate key
异常!如果要避免这种错误,可以加上第三个参数,用来处理重复,不过需要注意,内容不能为空
List<Book> books = bookMapper.list();
Map<String, Book> bookMap = books.stream().collect(Collectors.toMap(Book::getBookId, book -> book, (b, b1) -> b));
避免内容为空可以对内容进行判断赋默认值
List<Book> books = bookMapper.list();
Map<String, Book> bookMap = books.stream().collect(Collectors.toMap(Book::getBookId, book -> Optional.ofNullable(book).orElse(new Book()), (b, b1) -> b));
结果结构
{
"1": {
"bookId": "1",
"bookTitle": "书1"
},
"2": {
"bookId": "2",
"bookTitle": "书2"
},
}
2. 转Array
List<Book> books = bookMapper.list();
String[] bookIds = books.stream().map(Book::getBookId).toArray(String[]::new);
3. 字符串拼接
List<Book> books = bookMapper.list();
String bookNames = books.stream().map(Book::getBookTitle).collect(Collectors.joining(","));
结果结构
"书1,书2"
4. 类型转换
List<Book> books = bookMapper.list();
List<Book2> book2s = books.stream().map(book -> {
Book2 book2 = new Book2();
BeanUtils.copyProperties(book, book2);
}).collect(Collectors.toList());
5. 条件判断(存在任意匹配的)
List<Book> books = bookMapper.list();
if (books.stream().anyMatch(book -> !book.getBookTitle.contains("书"))) {
throw new RuntimeException("存在非正常书名称");
} else {
return books;
}
6. 条件判断(无匹配的)
List<Book> books = bookMapper.list();
if (books.stream().noneMatch(book -> "1".equals(book.getType()))) {
throw new RuntimeException("无指定类型的书籍");
}
7. 修改数据项
List<Book> books = bookMapper.list();
return books.stream().peek(book -> book.setBookTitle(null)).collect(Collectors.toList());
8. 过滤
List<Book> books = bookMapper.list();
return books.stream().filter(book -> "1".equals(book.getType())).collect(Collectors.toList());
9. 排序
List<Book> books = bookMapper.list();
return books.stream().sorted(Comparator.comparing(Book::getCreateTime)).collect(Collectors.toList());
对于字符串可以转换类型排序
List<String> strings = Arrays.asList("3", "6", "10", "1", "60");
List<String> collect = strings.stream().sorted().collect(Collectors.toList());
// 结果:[1, 10, 3, 6, 60]
List<String> collect = strings.stream().sorted(Comparator.comparingInt(Integer::valueOf)).collect(Collectors.toList());
// 结果:[1, 3, 6, 10, 60]
倒序只需要添加reversed方法
List<String> collect = strings.stream().sorted(Comparator.comparingInt(Integer::valueOf).reversed()).collect(Collectors.toList());
// 结果:[60, 10, 6, 3, 1]
10. 按字段去重
按字段去重比较麻烦,通过 collectingAndThen
和 toMap
结合实现,实际上是利用了 toMap
的去重能力,然后通过 collectingAndThen
再对 Map 进行转换。
注意:Book 集合中的项不能为空,否则会报错,见 转Map
中的说明。
还需要注意的是,因为是通过 Map
来实现去重的,所以去重后的数据是 无序的
,有要求的话需要额外排序。
List<Book> bookList = books.stream().collect(Collectors.collectingAndThen(
Collectors.toMap(Book::getBookName, book -> book, (book, book2) -> book),
stringBookMap -> new ArrayList<>(stringBookMap.values())
)).stream().collect(Collectors.toList());