Java8的Stream流真香,没体验过的永远不会知道!

    虽然现在Oacle官方发布的最新JDK版本已经到了JDK14。但我相信很多团队的生产系统上还是JDK8,甚至有的团队还是JDK7或者JDK6。即便很多团队已经将生产环境升级为JDK8,但是代码却还是老代码,也就是说根本没有使用JDK8提供的新特性。

JDK8 给程序员来带了很多便利,甚至可以让Java程序员跟Python,Ruby等程序员撕逼的时候,也能够扬眉吐气一把;因为JDK8终于开始支持“行为参数化了”,也就是大家经常说的,可以把一个函数当作参数传给另一个函数。

JDK8最明显的两个变化就是开始支持Lambda表达式,以及集合的Stream流式处理。这两个特性都可以让我们写的代码更优雅,也能让我们在实现某些功能的时候更轻松,特别是Stream,那简直是超级好用,性价比超级高,花上20分钟去学习一下,就能让你的代码质量提升一个档次。

Java8的Stream流真香,没体验过的永远不会知道!

 

下面我列举几个简单的小场景,让各位感受一下Java8提供的StreamAPI是多么的方便优雅,也算是抛砖引玉了。

日常编码的时候用的最多的应该就是集合了。比如从数据库里查询出一天卖出去多少本书,一般我们会这样写,List<Book> books = query.find(date); 然后针对这个集合会做各种各样的操作来满足产品层面的需求。

场景一:打印出每本书的详情。

JDK8之前

//打印出每本书的详情
for (Book book : books){
    System.out.println(book.toString());
}

使用Stream之后

//打印每本书详情
books.stream().forEach(book -> book.toString());

场景二:选出价格高于20元的

JDK8之前

List<Book> highPriceBooks = new ArrayList<>();
for (Book book : books){
    if (book.getPrice()>20){
        highPriceBooks.add(book);
    }
}

使用Stream之后

highPriceBooks = books.stream().filter(book -> book.getPrice()>20).collect(Collectors.toList());

场景三: 按照书价排序

JDK8之前

List<Book> sortBooks = new ArrayList<>();
for (Book book : books){
    Collections.sort(books, new Comparator<Book>() {
        @Override
        public int compare(Book o1, Book o2) {
            if (o1.getPrice() > o2.getPrice()){
                return 1;
            }else if (o1.getPrice() < o2.getPrice()){
                return -1;
            }else {
                return 0;
            }
        }    
     });
}

使用Stream之后

sortBooks = books.stream().sorted(Comparator.comparing(Book::getPrice)).collect(Collectors.toList());

如果你喜欢可以直接通过reversed() 反转,像这样

sortBooks = books.stream().sorted(Comparator.comparing(Book::getPrice).reversed()).collect(Collectors.toList());

场景四:获取所有书名

JDK8之前

List<String> bookNames = new ArrayList<>();
for (Book book : books){
    bookNames.add(book.getName());
}

使用Stream之后

bookNames = books.stream().map(Book::getName).collect(Collectors.toList());

场景五:获得所有书价格总和

JDK8之前

//计算一天当中卖出的所有书的价格总和。
int totalNum = 0;
for (Book book : books){
    totalNum += book.getPrice();
}

使用Stream之后

totalNum = books.stream().map(Book::getPrice).reduce(0,(a,b)->a+b);

场景六:把集合中对象的两个属性转为map

Map<String,Integer> bookMap = books.stream().collect(Collectors.toMap(Book::getName, Book::getPrice));

//找到map中的第一个key 
bookMap.keySet().stream().findFirst().get();

场景七:根据集合中对象的属性,筛选符合条件的组成新的集合

//筛选书名不等于空,并且价格大于18的书籍
List<Book> book = booke.stream().filter(s->!StirngUtils.isEmpty(s.getName()) && s.getPrice() >= 18).collect(Collectors.toList());

还有更多

你以为JDK8的Stream就这么点本事吗?它还可以完成链式处理,像这样

//选出价格高于20的两个元素。
books.stream().filter(book -> book.getPrice()> 20).limit(2).collect(Collectors.toList());

此外如果你想利用你多核的CPU并行处理集合以提高计算速度,在JDK8中只需要简单的调用一下parallelStream 方法。就像这样books.parallelStream().forEach(book -> book.toString()); JDK自动帮你并行处理,厉不厉害。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值