(63)Java基础 --Stream API

目录

一、概述

二、Stream类型数据的获取

三、Stream中的常用方法

四、练习


一、概述

在jdk1.8中,提供了一个Stream类型,可以对数据进行过滤

好处:

     比不断的自定义循环,要简单很多

public class Demo01_StreamAPI {
	
  public static void main(String[] args) {
	  
	    ArrayList<String> names = new ArrayList<>();
		names.add("张一一");
		names.add("张三三");
		names.add("周四四");
		names.add("张二");
		names.add("赵六");
		names.add("宫七七七七");
		//test1(names);
		test2(names);
  }
  
  //不使用Stream—— 获取集合中,姓张并三个字名字,获取集合之后,还要打印集合的内容
  public static void test1(List<String> list){
	  ArrayList<String> result = new ArrayList<>();
	  
	  for(String name:list){
		  if(name.startsWith("张") && name.length()==3){
			  result.add(name);
		  }
	  }
	  
	  for(String name:result){
		  System.out.println(name);
	  }
	  
  }
  
  //Stream—— 获取集合中,姓张并三个字名字,获取集合之后,还要打印集合的内容
  public static void test2(List<String> list){
	  //list.stream().filter((x)->x.startsWith("张")).forEach(System.out::println);
	  list.stream().filter((x)->x.startsWith("张")).filter((x)->x.length()==3).forEach(System.out::println);
  }
  
}

二、Stream类型数据的获取

Collection的获取

  调用stream()方法即可,返回Stream类型的对象

Map的获取

 不能直接获取Stream类型

  1、keySet().stream()

  2、values().stream()

  3、entrySet().stream()

数组的获取

  Stream中的of方法,Stream.of(数组)

public class Demo02_各种集合获取Stream的方式 {
	
	public static void main(String[] args) {
		// Collection  直接调用 stream()
		
		Collection col = new ArrayList();
		Stream s1 = col.stream();
		
		List list = new ArrayList();
		Stream s2 =list.stream();
		
		Set set = new HashSet();
		Stream s3 =set.stream();
		
		Map map = new HashMap();
		//map.stream();
		
		Stream s4 =map.keySet().stream();
		Stream s5 =map.values().stream();
		Stream s6 =map.entrySet().stream();
		
		int[] a = {1,2,3,4,5};
		
		Stream s7 =Stream.of(a);
	}
}

三、Stream中的常用方法

常用方法

Stream接口中的常用方法,用于对流中的数据,进行过滤、筛选或者操作

分类:

  1、终结方法:调用完成之后,返回值不再是Stream类型本身,无法继续调用Stream中的方法

  例如:forEach、count

2、延迟方法:调用完成之后,返回值还是Stream类型,可以继续调用Stream中的各种方法

  例如:除了终结方法,全都是延迟方法

  Stream<T>  filter(Predicate<? super T> pre)

    根据pre描述的判断条件,对流中的数据进行过滤

  Stream<T>  limit(long maxSize)

    根据参数maxSize描述的个数,对流中的数据进行截取

  Stream<T>  skip(long n)

    跳过参数n描述的个数,流中剩余的是n之后的内容

   

  Stream<R>  map(Function<? super T, R> fun )

    将流中的所有T类型数据,都根据fun这个函数型接口,转换成其他的R类型数据

  forEach(Consumer<? super T>  con)

    将流中的数据,根据con描述的处理方式,进行处理

  long count()

    返回流中的元素数

public class Demo03_Stream的方法 {
	
	public static void main(String[] args) {
		ArrayList<String> names = new ArrayList<>();
		names.add("张一一");
		names.add("张三三");
		names.add("周四四");
		names.add("张二");
		names.add("赵六");
		names.add("宫七七七七");
		
		long num = names.stream().count();
		System.out.println(num);
		
		names.stream().filter((x)->x.length()==3).forEach(System.out::println);
		names.stream().limit(4).forEach(System.out::println);
		names.stream().skip(2).limit(4).forEach(System.out::println);
		names.stream().map((x)->"hello,"+x).forEach(System.out::println);
	}
}

四、练习

有两个Arraylist集合,存储队伍中的多个成员姓名,使用Stream方式,对以下步骤进行操作

第一个队伍只要名字为3个字的成员姓名

第一个队伍只要筛选之后的前三个人

第二个队伍只要姓张的

第二个队伍筛选之后不要前两个人

将两个队伍合并成一个队伍

合并之后的队伍中的所有人的Person(自定义类型)对象,存储到一个ArrayList集合中

队伍1:宫一一一、宋二二、苏三三、石四四、时五五、李六、庄七、洪八

队伍2:帕一一一、张二二、赵三三、张四四、孛五五五五五五、张六六、张七七

public class Demo04_Stream练习 {
	
/*
有两个List集合,存储队伍中的多个成员姓名,使用Stream方式,对以下步骤进行操作
第一个队伍只要名字为3个字的成员姓名
第一个队伍只要筛选之后的前三个人

第二个队伍只要姓张的
第二个队伍筛选之后不要前两个人

将两个队伍合并成一个队伍
合并之后的队伍中的所有人的Person(自定义类型)对象,存储到一个ArrayList集合中

队伍1:宫一一一、宋二二、苏三三、石四四、时五五、李六、庄七、洪八
队伍2:帕一一一、张二二、赵三三、张四四、孛五五五五五五、张六六、张七七
 */
	
	public static void main(String[] args) {
		
		String str1 = "宫一一一、宋二二、苏三三、石四四、时五五、李六、庄七、洪八";
		String str2 = "帕一一一、张二二、赵三三、张四四、孛五五五五五五、张六六、张七七";
		
		String[] ss1 = str1.split("、");
		String[] ss2 = str2.split("、");
		
		List<String> list1 = Arrays.asList(ss1);
		List<String> list2 = Arrays.asList(ss2);
		
		Stream<String> s1 = list1.stream().filter((x)->x.length()==3).limit(3);
		Stream<String> s2 = list2.stream().filter((x)->x.startsWith("张")).skip(2);
		
		Stream<String> ss = Stream.concat(s1,s2);  // 合并两个流
		
		List<Person> personList = new ArrayList<>();
		
		ss.forEach((x)->{
			Person p= new Person(x);
			personList.add(p);
		});
		
		System.out.println(personList);
	}
}

class Person{
	
	private String name;
	
	
	public Person() {
		super();
	}

	public Person(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值