Java8的Stream流(1)

不讲道理,先说怎么用

假设有个需求:
集合有如下数据

【武汉大学
武汉科技大学
武汉工程大学
中国地质大学
华中科技大学
华侨大学
华中师范大学
华中农业大学】
  • 打印出 以-华-开头,且长度为六的字符串
		List<String> list = new ArrayList<>();
		list.add("武汉大学");
		list.add("武汉科技大学");
		list.add("武汉工程大学");
		list.add("中国地质大学");
		list.add("华中科技大学");
		list.add("华侨大学");
		list.add("华中师范大学");
		list.add("华中农业大学");
		//打印出 以-华-开头,且长度为六的字符串
		
		for (String string : list) {
			if(string.length()==6&&string.startsWith("华"))
				System.out.println(string);
		}

换成stream方式

	list
		.stream()
		.filter(s->s.startsWith("华")&&s.length()==6)
		.forEach(System.out::println);
  • 还是上面的数据,打印出前三个数据。
	list
		.stream()
		.limit(3)
		.forEach(System.out::println);
  • 跳过前三个后打印头两个
	list
		.stream()
		.skip(3)
		.limit(2)
		.forEach(System.out::println);

是不是有那味了,这下知道了怎么用了吧。

  • 将前四个数据生成一个流,跳过两个数据生成一个流
Stream<String> s1 = list.stream().limit(4);
Stream<String> s2 = list.stream().skip(2);

获得的s1只能使用一次,不能二次使用
执行一次
s1.forEach(System.out::println);
在执行一次
s1.forEach(System.out::println);
爆异常IllegalStateException

  • 合并s1和s2并打印出来
Stream.concat(s1, s2).forEach(System.out::println);

打印如下 有重复

武汉大学
武汉科技大学
武汉工程大学
中国地质大学
武汉工程大学
中国地质大学
华中科技大学
华侨大学
华中师范大学
华中农业大学
  • 去重复
Stream.concat(s1, s2).distinct().forEach(System.out::println);

换个拼音玩玩

list.clear();
list.add("wuhandaxue");
list.add("wuhankejidaxue");
list.add("wuhangongchengdaxue");
list.add("zhongguodizhidaxue");
list.add("huazhongkejidaxue");
list.add("huaqiaodaxue");
list.add("huazhongshifandaxue");
list.add("huazhongnongyedaxue");
  • 搞个排序
list
	.stream()
	.sorted()
	.forEach(System.out::println);

自然排序

huaqiaodaxue
huazhongkejidaxue
huazhongnongyedaxue
huazhongshifandaxue
wuhandaxue
wuhangongchengdaxue
wuhankejidaxue
zhongguodizhidaxue
  • 加个条件,按长度排序
list
	.stream()
	.sorted((a,b)->a.length()-b.length())
	.forEach(System.out::println);

长度一样的,排序有点瑕疵

wuhandaxue
huaqiaodaxue
wuhankejidaxue
huazhongkejidaxue
zhongguodizhidaxue
wuhangongchengdaxue
huazhongshifandaxue
huazhongnongyedaxue
  • 长度一样的,来个自然排序
list
	.stream()
	.sorted((a,b)->{
		int num = a.length()-b.length();
		return num==0?a.compareTo(b):num; 
	})
	.forEach(System.out::println);
wuhandaxue
huaqiaodaxue
wuhankejidaxue
huazhongkejidaxue
zhongguodizhidaxue
huazhongnongyedaxue
huazhongshifandaxue
wuhangongchengdaxue

感觉有点长,另起一篇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值