Java——Stream数据流(Properties子类、Collection接口加强、MapReduce操作)

举报
Winter_world 发表于 2021/09/29 00:36:59 2021/09/29
【摘要】 目录 1、Properties子类 2、Collection接口加强 3、数据流基本操作 4、MapReduce操作(重要) 5、总结 1、Properties子类 Properties是专门存储属性信息操作的类,其为Hashtable的子类,Hashtable能保存各种类型数据,但Properties类只能进行字符串数...

目录

1、Properties子类

2、Collection接口加强

3、数据流基本操作

4、MapReduce操作(重要)

5、总结


1、Properties子类

Properties是专门存储属性信息操作的类,其为Hashtable的子类,Hashtable能保存各种类型数据,但Properties类只能进行字符串数据的保存,因为其主要用于资源文件操作的。

在使用时,使用的是子类中定义的方法

  • 构造方法:public Properties();
  • 设置属性:public Object setProperties(String key,String value); 若内容不存在,返回null
  • 取得属性:public Object getProperties(String key);若内容不存在,返回默认值

在Properties中有两个重要的操作方法:

1)将属性输出到指定输出流中


  
  1. Properties pro = new Properties();
  2. pro.setProperty("SH","上海");
  3. pro.setProperty("NJ","南京");
  4. try {
  5. pro.store(new FileOutputStream(new File("D:"+File.separator+"test.properties")),"test");
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }

其中打开保存的文档,可见中文为UNICODE编码

2)从输入流读取属性信息


  
  1. try {
  2. pro.load(new FileInputStream(new File("D:"+File.separator+"test.properties")));
  3. } catch (IOException e) {
  4. e.printStackTrace();
  5. }
  6. System.out.println(pro.getProperty("NJ"));

读出后可发现,资源文件中不能有中文,中文是要经过编码转换的。

当Properties与国际化结合会非常好用,其中不要忽略ResourceBundle类的使用。

2、Collection接口加强

JDK1.8开始,由于接口上可以使用default、static定义方法,那么一些已有接口发生了本质的改变。Iterator接口中提供有一个:

default void forEach(Consumer<?super T>action)


  
  1. List<String> list =new ArrayList<>();
  2. list.add("A");
  3. list.add("B");
  4. list.forEach(System.out ::println); //方法引用

list.forEach(System.out ::println); 直接输出数据,但Collection接口的最重要的改变不是这里,而是在Collection接口的一个方法上:
获取数据流对象:default java.util.stream.Stream<E>stream(). 


  
  1. List<String> list =new ArrayList<>();
  2. list.add("A");
  3. list.add("A");
  4. list.add("B");
  5. Stream<String> stream = list.stream().distinct();//排除重复元素
  6. System.out.println(stream.count()); //输出结构为2

3、数据流基本操作

为什么要用Stream?取得数据流,主要 的目的是为了进行数据处理使用。在Sream类中有以下几个方法较为典型:

1)过滤:public Stream<T> filter(Predicate<? super T> var1)。--需要满足某些条件才可以过滤

【举例】:简单过滤


  
  1. List<String> list =new ArrayList<>();
  2. list.add("ANV");
  3. list.add("AVVC");
  4. list.add("BXX");
  5. Stream<String> stream = list.stream().filter((x) -> x.contains("A")); //过滤出包含A的
  6. System.out.println(stream.count()); //输出结果为2

以上只是简单过滤,类似统计操作,没什么意思,若想把符合条件的数据筛选出来,可以使用收集器:

2)public<R,A> R collect(Collector<?super T,A,R> collector)

需要使用Collector接口,该接口可通过java.util.stream.Collectors进行实例化,以List集合收集:

public static<T> Collector<T,?,List<T>>toList().

【举例】:收集操作


  
  1. List<String> list =new ArrayList<>();
  2. list.add("ANV");
  3. list.add("AVVC");
  4. list.add("BXX");
  5. List<String> list1 = list.stream().filter((x) -> x.contains("A")).collect(Collectors.toList()); //过滤出包含A的
  6. System.out.println(list1);

以上filter方法是区分大小写的,若把数据都换为小写,则无法收集,可以使用转换方法:

3)转换<R> Stream<R> map(Function<? super T, ? extends R> var1);

【举例】:使用map()方法处理


  
  1. List<String> list =new ArrayList<>();
  2. list.add("anv");
  3. list.add("avvc");
  4. list.add("BXX");
  5. List<String> list1 = list.stream().map((x)-> x.toUpperCase()).filter((x) -> x.contains("A")).collect(Collectors.toList()); //过滤出包含A的
  6. System.out.println(list1);

4)但是,在大数据范围中是允许有分页的,所以可以直接在数据流上进行分页处理操作:

  • 跳过的数据行数:Stream<T> skip(long var1);
  • 取得的行数:Stream<T> limit(long var1);

【举例】:实现分页


  
  1. List<String> list =new ArrayList<>();
  2. list.add("ANV");
  3. list.add("AVVC");
  4. list.add("BXX");
  5. list.add("BACX");
  6. list.add("ACX");
  7. List<String> list1 = list.stream().map((x)-> x.toUpperCase()).filter((x) -> x.contains("A"))
  8. .skip(2)
  9. .limit(1)
  10. .collect(Collectors.toList()); //过滤出包含A的
  11. System.out.println(list1);

实现分页前后对比结果:

4、MapReduce操作(重要)

大数据定义范畴中,MapReduce属于两个层次的概念:

  • Map处理:针对每行数据进行处理操作;
  • Reduce处理:分析统计。

【举例】:做一个订单处理


  
  1. List<Order> all = new ArrayList<>();
  2. all.add(new Order("电子",1,1));
  3. all.add(new Order("蔬菜",1,10));
  4. all.add(new Order("日用品",1,100));
  5. double allPrice = all.stream().map((x)-> x.getPrice()*x.getAmount()).reduce((sum,m)-> sum+m).get();
  6. System.out.println(allPrice);

一般处理需要涉及5种数据:种类、平均值、最高值、最低值、总值,在整个处理的数据类型一定是double,此时需要进行一些额外的处理:

  • 以Double处理:DoubleStream mapToDouble(ToDoubleFunction<? super T> var1);

取得DoubleStream后,进一步对数据进行处理,处理使用:

  • 处理操作:DoubleSummaryStatistics summaryStatistics();

  
  1. List<Order> all = new ArrayList<>();
  2. all.add(new Order("电子",1,1));
  3. all.add(new Order("蔬菜",1,10));
  4. all.add(new Order("日用品",1,100));
  5. DoubleSummaryStatistics dss = all.stream().mapToDouble((x)-> x.getPrice()*x.getAmount()).summaryStatistics();
  6. System.out.println("种类:"+ dss.getCount());
  7. System.out.println("平均流水:"+ dss.getAverage());
  8. System.out.println("最高销售额:"+ dss.getMax());
  9. System.out.println("最低销售额:"+ dss.getMin());
  10. System.out.println("总销售额:"+ dss.getSum());

5、总结

1)JDK1.8对类集提供了更多的处理支持;

2)MapReduce:Map处理数据,Reduce统计数据。

 

作于202003172030,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/104862364

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。