Java集合--Stream数据流
内容学习于:edu.aliyun.com
前言:
数据流是从JDK 1.8的时候提供的一种快速 的数据处理能力,其主要是工作在类集.上,在JDK 1.8开始之后Collection接口里面追加了两个新的方法:
- 并行数据流计算: public default Stream parallelStream();
- 数据流计算: public default Stream stream();
所有的流计算都使用Stream进行描述。
1. Stream基础操作
流的计算主要是避免迭代操作所造成的性能浪费,也就是说对于数据的处理使用Stream性能更高,它的主要设计还是为了大数据分析准备的。
Stream基本操作:
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
List<String> all = new ArrayList<>();
Collections.addAll(all,"Java","JavaScript","Ruby","Python","Go");
Stream<String> stream = all.stream();// 将数据转变成数据流
System.out.println(stream.filter(ele->ele.toLowerCase().startsWith("j")).count());
}
}
结果:
2
对于此时的代码,暂时不要通过技术的思想去思考,只是关注于代码的简洁性,简洁性的确是非常高的。
以上的操作只是针对于给定的集合数据实现了简单的处理统计,但是如果有需要也可以进行子集合截取。
将数据分割成新的集合:
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
List<String> all = new ArrayList<>();
Collections.addAll(all,"Java","JavaScript","Ruby","Python","Go");
Stream<String> stream = all.stream();// 将数据转变成数据流
List<String> subList = stream.filter(ele->ele.toLowerCase().startsWith("j")).collect(Collectors.toList());
System.out.println(subList);
}
}
结果:
[Java, JavaScript]
在进行数据处理的时候如果未加任何的限制,所有的数据的筛选和处理都是从头一直处理到结尾的,如果有需要也可以进行部分数据的处理操作,可以使用Stream提供的两个方法:
- 设置取出的最大数据量: public Stream limit(long maxSize);
- 跳过多少数据量: public Stream skip(long m)。
实现部分数据处理:
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
List<String> all = new ArrayList<>();
Collections.addAll(all,"Java","JavaScript","Ruby","Python","Go");
Stream<String> stream = all.stream();// 将数据转变成数据流
List<String> subList = stream.filter(ele->ele.toLowerCase().startsWith("j")).skip(1).limit(3).collect(Collectors.toList());
System.out.println(subList);
}
}
结果:
[JavaScript]
流就是简化处理操作,同时结合Lambda实现简单的数据分析处理。
2. MapReduce模型
在JDK1.8里面除Steam之外实际上,还针对于Google提出的分布式数据计算模型进行了实现,而这个模型就称为MapReduce,实际上这个标盘有两个处理阶段:
- Map处理:对数据进行各种的先期处理,例如,可能需要进行计算,或者其它的转型等;
- Reduce 处理:数据的统计计算,针对于处理好的数据内容进行统计操作。
使用Stream实现MapReduce模型:
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
List<Order> all = new ArrayList<>();
all.add(new Order("佩奇猪娃娃", 19.8, 200));
all.add(new Order("辛博娃娃", 0.8, 200));
all.add(new Order("成成娃娃", 32000.8, 20));
all.add(new Order("Java学习", 98.8, 200));
DoubleSummaryStatistics statistics = all.stream().filter(ele -> ele.getName().contains("娃娃")).mapToDouble(orderObject -> orderObject.getCount() * orderObject.getPrice()).summaryStatistics();
System.out.println("【购买数量】:" + statistics.getCount());
System.out.println("【总花销】:" + statistics.getSum());
System.out.println("【最高价格】:" + statistics.getMax());
System.out.println("【最低价格】:" + statistics.getMin());
System.out.println("【平均价格】:" + statistics.getAverage());
}
}
结果:
【购买数量】:3
【总花销】:644136.0
【最高价格】:640016.0
【最低价格】:160.0
【平均价格】:214712.0
这类的操作理论上都应该交由数据分析人员的实现,但是随着技术的发展,数据分析也早晚都是你的事。