资讯专栏INFORMATION COLUMN

Java 8之stream实际应用

jonh_felix / 2235人阅读

摘要:前言在前面的之介绍和使用和之进阶中讲了的使用方式和一些常用的方法,这篇文章就来演示一下的实际应用。实际应用先创建一个订单类和商品类,每个订单都有年份商品数量和商品对象属性,而商品类里面则包含了名字和价格属性。

前言:

在前面的 Java 8之stream介绍和使用 和 Java 8之stream进阶 中讲了stream的使用方式和一些常用的方法,这篇文章就来演示一下stream的实际应用。

实际应用:

先创建一个订单类和商品类,每个订单都有年份、商品数量和商品对象属性,而商品类里面则包含了名字和价格属性。像这种结构的数据在日常开发中会经常看到,现在就使用stream来尝试满足各种不同的类型的数据获取。

public class Goods {
    //商品名字
    private final String name;
    //商品价格
    private final String price;

    public Goods(String name, String price) {
    this.name = name;
    this.price = price;
    }

    public String getName() {
        return name;
    }

    public String getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return "Goods{" +
            "name="" + name + """ +
            ", price="" + price + """ +
            "}";
    }
}

public class Order {
    //商品对象
    private final Goods goods;
    //订单日期
    private final int year;
    //商品数量
    private final int total;

    public Order(Goods goods, int year, int total) {
        this.goods = goods;
        this.year = year;
        this.total = total;
    }

    public Goods getGoods() {
        return goods;
    }

    public int getYear() {
        return year;
    }

    public int getTotal() {
        return total;
    }

    @Override
    public String toString() {
        return "Order{" +
            "goods=" + goods +
            ", year=" + year +
            ", total=" + total +
            "}";
    }
}

模拟点数据

public class testClass {
    static Goods bread = new Goods("面包", 10.0);
    static Goods milk = new Goods("牛奶", 12.0);
    static Goods juice = new Goods("果汁", 6.0);
    static Goods ham = new Goods("火腿", 20.0);

    static List orders = Arrays.asList(
    new Order(ham, 2011, 300),
    new Order(bread, 2012, 1000),
    new Order(bread, 2011, 400),
    new Order(milk, 2012, 710),
    new Order(milk, 2012, 700),
    new Order(juice, 2012, 950)
);

下面来试使用stream获取不同条件下的数据

//找出2011年所有的订单,按商品数量从低到高排序
public static void findOne(){
    orders.stream()
    //先筛选年份
    .filter(trader -> trader.getYear()==2011)
    //再排序商品数量
    .sorted(Comparator.comparing(Order::getTotal))
    .collect(Collectors.toList())
    .forEach(System.out::println);
}

//获取所有订单的里所有商品的单价 
public static void findTwo() {
    orders.stream()
    //先查出所有订单的里的商品价格
    .map(order -> order.getGoods().getPrice())
    //去重后转化为List类型
    //.distinct()
    //.collect(Collectors.toList())
    //或者直接转化为Set类型,自动去重
    .collect(Collectors.toSet())
    .forEach(System.out::println);
}

//查找订单中所有单价为12的商品
public static void findThree() {
    orders.stream()
    //获取商品的流
    .map(order -> order.getGoods())
    //价格等于12的
    .filter(goods -> goods.getPrice().equals(12.0))
    //去重
    .distinct()
    .collect(Collectors.toList())
    .forEach(System.out::println);
}

//查所有商品的名字,拼接成一个符串
public static void findFour() {
    String string = orders.stream()
    //获取所有商品的名字
    .map(order -> order.getGoods().getName())
    //去重
    .distinct()
    //使用reduce方法自行拼接
    //.reduce("",(str1,str2) -> str1 + str2);
    //或者使用joining方法自动拼接
    .collect(Collectors.joining());
    System.out.println(string);
}

//判断所有订单中是否有价格为20的商品
public static void findFive() {
    boolean flag = orders.stream()
    //查询是否有符合条件的元素
    .anyMatch(order -> order.getGoods().getPrice().equals(20.0));
    System.out.println(flag);
}

//所有订单中商品价格12的商品累计数量
public static void findSix() {
    int num = orders.stream()
    //筛选出价格12的商品
    .filter(order -> order.getGoods().getPrice().equals(12.0))
    //获取价格为12的商品的金额组成的流
    .map(Order::getTotal)
    //累加所有的金额
    .reduce(0, Integer::sum);
    System.out.println(num);
}

//找出所有订单中最大的数量
public static void findSeven() {
    int max = orders.stream()
    //获取所有订单的数量
    .map(Order::getTotal)
    //找到最大的
    .reduce(0, Integer::max);
    System.out.println(max);
}

//找出所有订单中商品数量最小的
public static void findEight() {
    orders.stream()
    //获取所有订单的数量
    .map(Order::getTotal)
    //找到最大的
    .reduce(Integer::min)
    //如果返回的结果不是空就打印
    .ifPresent(System.out::println);
}

总结:

以上就是stream的实际应用,上述情况在日常开发中还是很常见到的,如果不用stream的代码写起来不仅非常繁琐还容易出错,得新建很多个集合不停的遍历、判断和存取,但是用了stream之后就非常的简单,代码也很清晰,后面还会介绍到stream别的特性和用法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76772.html

相关文章

  • Top stackoverflow 问答系列Java 8 Stream 篇 (一)

    摘要:从发布到现在,已有三年多了,也得到了广泛的应用,但似乎里面最重要的特性和对很多人来说还是很陌生。想通过介绍一些实际的问题和答案来讲解在现实开发中我们可以通过和可以做些什么,以及什么是正确的姿势。 从Java 8 2014 发布到现在,已有三年多了,JDK 8 也得到了广泛的应用,但似乎Java 8里面最重要的特性:Lambdas和Stream APIs对很多人来说还是很陌生。想通过介绍...

    z2xy 评论0 收藏0
  • Java 8怎么了:局部套用vs闭包

    摘要:本文主要介绍了中的闭包与局部套用功能,由国内管理平台编译呈现。譬如,认为给带来了闭包特性就是其中之一。但是首先,我们将考虑如何利用闭包进行实现。很显然,闭包打破了这一准则。这就是局部调用,它总是比闭包更为稳妥。 【编者按】本文作者为专注于自然语言处理多年的 Pierre-Yves Saumont,Pierre-Yves 著有30多本主讲 Java 软件开发的书籍,自2008开始供职于 ...

    3fuyu 评论0 收藏0
  • Java 8stream进阶

    摘要:获取每个元素的字符串长度放入新流中,然后转为类型。归约归约就是把整个流归约成一个值的操作,比如求集合中最大的元素所有元素值的和之类的操作。 前言: 上一篇文章 Java 8之stream介绍和使用 中讲解了stream的定义和用法,简单介绍几个最基本最常用的方法,其实stream还有更强大的功能,这篇文章就会给大家介绍stream的进阶用法。 筛选: 在上一篇文章中我们介绍了使用fi...

    Jaden 评论0 收藏0
  • Java 8stream介绍和使用

    摘要:使用我们来看下面这段代码,里面有一个属性代表菜品的卡路里值,现在的需求是按卡路里对菜品进行排序再返回菜名,并且要求卡路里的值大于。 前言: 在实际开发中经常需要获取各种各样不同格式的数据,因为数据库的表结构是一开始就设计好的所以很多时候我们不得不先从数据库里或其他地方获得数据后再根据需求去一层一层的筛选数据,在Java 8之前的做法不外乎就是各种List、Set一起上,各种循环判断。如...

    gxyz 评论0 收藏0
  • Java 8 Strem基本操作

    摘要:可以使用方法替换常规循环以上代码的产出所有这些原始流都像常规对象流一样工作,但有以下不同之处原始流使用专门的表达式,例如代替或代替。原始流支持额外的终端聚合操作,以上代码的产出有时将常规对象流转换为基本流是有用的,反之亦然。 本文提供了有关Java 8 Stream的深入概述。当我第一次读到的Stream API,我感到很困惑,因为它听起来类似Java I/O的InputStream,...

    Jensen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<