Java之Stream的实用语法

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. 按字段去重

按字段去重比较麻烦,通过 collectingAndThentoMap 结合实现,实际上是利用了 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());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会功夫的李白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值