Java类集框架--Stream

**

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值