Java steam流中toMap、groupingBy、flatMap的简单用法

@Data
@ToString
public class Book {

    private String category;

    private String name;

    private int stock;

    public Book(String category, String name, int stock) {
        this.category = category;
        this.name = name;
        this.stock = stock;
    }
}

public static void main(String[] args) {
    List<Book> bookList = new ArrayList<>();
    bookList.add(new Book("小说", "《西游记》", 1));
    bookList.add(new Book("小说", "《鹿鼎记》", 2));
    bookList.add(new Book("历史", "《史记》", 3));
    bookList.add(new Book("历史", "《四书五经》", 4));

    // 根据类型进行汇总,同一个类型的书籍对象放到一个List中
    Map<String, List<Book>> bookMap1 = bookList.stream()
        .collect(Collectors.groupingBy(Book::getCategory));
    // bookMap1 : {"历史":[{"category":"历史","name":"《史记》","stock":3},{"category":"历史","name":"《四书五经》","stock":4}],"小说":[{"category":"小说","name":"《西游记》","stock":1},{"category":"小说","name":"《鹿鼎记》","stock":2}]}

	// 根据库存数进行分类,分为备货充足和缺货两种
    Map<String, List<Book>> bookMap5 = bookList.stream()
    	.collect(Collectors.groupingBy(book -> book.getStock() >= 2 ? "备货充足": "缺货"));
    System.out.println(bookMap5);
    // bookMap5: {缺货=[Book(category=小说, name=《西游记》, stock=1)], 备货充足=[Book(category=小说, name=《鹿鼎记》, stock=2), Book(category=历史, name=《史记》, stock=3), Book(category=历史, name=《四书五经》, stock=4)]}

    // 根据类型进行汇总,同一个类型的书籍名称放到一个List中
    Map<String, List<String>> bookMap2 = bookList.stream()
        .collect(Collectors.groupingBy(Book::getCategory, Collectors.mapping(Book::getName, Collectors.toList())));
    // bookMap2 : {"历史":["《史记》","《四书五经》"],"小说":["《西游记》","《鹿鼎记》"]}
    
    // 转化为名称,库存Map
    Map<String, Integer> bookMap3 = bookList.stream()
        .collect(Collectors.toMap(Book::getName, Book::getStock, (oldVal, newVal) -> newVal));
    // bookMap3 : {"《四书五经》":4,"《史记》":3,"《鹿鼎记》":2,"《西游记》":1}

    // 根据名称进行库存量的汇总
    Map<String, Integer> bookMap4 = bookList.stream()
        .collect(Collectors.toMap(Book::getCategory, Book::getStock, Integer::sum));
    // bookMap4 : {"历史":7,"小说":3}
	
	// flatMap, 将返回的stream流对象进行合并
    List<List<Integer>> listList = new ArrayList<>();
    listList.add(Arrays.asList(1, 2, 3));
    listList.add(Arrays.asList(4, 5, 6));
    listList.add(Arrays.asList(7, 8, 9));
    List<Integer> resultList = listList.stream()
    .flatMap(list -> list.stream())
    .collect(Collectors.toList());
    // resultList: [1,2,3,4,5,6,7,8,9] 
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值