**
Java类集框架Stream数据流
**
为了简化处理数据,Java提供了一个数据流的操作接口:Stream。Stream接口中提供了大量的方法用来处理数据流。
long count() 返回此流中的元素数。
public class TestDemo3 {
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Stream<Integer> stream=list.stream();
System.out.print(stream.count()); //取得个数
}
}
程序结果:4
Stream distinct() 消除重复数据
public class TestDemo4 {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Java");
list.add("Java");
list.add("Android");
list.add("Android");
list.add("JDK");
list.add("JVM");
Stream<String> stream=list.stream(); //取得Stream对象
List<String> newList=stream.distinct().collect(Collectors.toList());
newList.forEach(System.out::println);
}
}
程序结果:Java
Android
JDK
JVM
在java.util.stream中,有一个Collectors类提供的的收集器方法。
public static Collector<T,?,List> toList()
返回一个Collector ,它将输入元素List到一个新的List 。同时使用filter()(断言型函数式接口)方法可以对数据进行过滤。
public class Hello {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Java");
list.add("Android");
list.add("JDK");
list.add("JVM");
Stream<String> stream=list.stream();
List<String> newList=stream.distinct().filter((x)->x.contains("a")).collect(Collectors.toList()); //包含“a”的进行过滤,收集器最后使用
newList.forEach(System.out::println);
}
}
运行结果:Java
但是这种写法并不完善,不能区分大小写。程序中的“A”和“a”并不能区分。所以可以在filter()之前使用map()进行添加大小写转换来进行操作。
public class TestDemo {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Java");
list.add("Android");
list.add("JDK");
list.add("JVM");
Stream<String> stream=list.stream();
List<String> newList=stream.distinct().map((x)->x.toLowerCase()).filter((x)->x.contains("a")).collect(Collectors.toList());
newList.forEach(System.out::println);
}
}
程序结果:java
android
数据流分页操作
使用skip()方法和limit()方法进行跨越和获取。
public class TestDemo5 {
public static void main(String[] args) throws Exception{
List<String> list=new ArrayList<String>();
list.add("Java");
list.add("Java");
list.add("android");
list.add("Android");
list.add("Android");
list.add("JDK");
list.add("JVM");
Stream<String> stream=list.stream();
//消除重复数据,将包含a的数据进行收集,同时跨越一条数据,限制取得一条数据
List<String> newList=stream.distinct().filter((x)->x.contains("a")).skip(1).limit(1).collect(Collectors.toList());//跨越1条数据,取得一条数据
newList.forEach(System.out::println);
}
}
程序结果:android
数据查询匹配,使用allMatch()和anyMatch()进行全匹配或者任意匹配。
public static void main(String[] args) throws Exception{
List<String> list=new ArrayList<String>();
list.add("Java");
list.add("Java");
list.add("android");
list.add("Android");
list.add("Android");
list.add("JDK");
list.add("JVM");
Stream<String> stream=list.stream();
if(stream.anyMatch((x)->x.contains("Java"))){
System.out.print("数据存在");
}
}
程序结果:数据存在
多条件进行查询,使用断言型函数接口Predicate()进行or和and操作。
public static void main(String[] args) throws Exception{
List<String> list=new ArrayList<String>();
list.add("Java");
list.add("Java");
list.add("android");
list.add("Android");
list.add("Android");
list.add("JDK");
list.add("JVM");
Stream<String> stream=list.stream();
Predicate<String> pre1=(x)->x.contains("ava");
Predicate<String> pre2=(x)->x.contains("oid");
if (stream.anyMatch(pre1.or(pre2))) {
System.out.print("数据存在");
}
}
程序结果:数据存在
Stream中提供map和reduce方法进行大量数据处理。
map负责数据处理
reduce负责数据分析
class Book{
private String title;
private double price;
private int amount;
public Book(String title,double price,int amount) {
this.title=title;
this.price=price;
this.amount=amount;
}
public int getAmount() {
return amount;
}
public double getPrice() {
return price;
}
public String getTitle() {
return title;
}
}
public class TestDemo8 {
public static void main(String[] args) throws Exception{
List<Book> list=new ArrayList<Book>();
list.add(new Book("小明和小红", 26.8, 10));
list.add(new Book("小明和小华", 89.2, 30));
list.add(new Book("小明和小花", 54.9, 50));
list.stream().map((x)->x.getAmount()*x.getPrice()).forEach(System.out::println);
}
}
程序结果:268.0
2676.0
2745.0
reduce处理数据
class Book{
private String title;
private double price;
private int amount;
public Book(String title,double price,int amount) {
this.title=title;
this.price=price;
this.amount=amount;
}
public int getAmount() {
return amount;
}
public double getPrice() {
return price;
}
public String getTitle() {
return title;
}
}
public class TestDemo8 {
public static void main(String[] args) throws Exception{
List<Book> list=new ArrayList<Book>();
list.add(new Book("小明和小红", 26.8, 10));
list.add(new Book("小明和小华", 89.2, 30));
list.add(new Book("小明和小花", 54.9, 50));
double price=list.stream().map((x)->x.getAmount()*x.getPrice()).reduce((sum, m)->sum+m).get();
System.out.println("总价"+price);
}
}
程序结果:总价5689.0