Stream流操作

Stream流是Java 8 发布的对集合操作的特性。
 函数式编程

主要概念:

  • 数据源
    指的是你要操作的集合数据
  • 数据处理
    指使用者要对数据源进行怎样的处理
  • 收集结果
    指处理完成后,把操作后的结果进行相应的处理

使用:

 1、一般情况下对集合数据进行相应的分类操作:
Stream流操作_第1张图片
 这样写会使得代码复用率不高且繁琐
 2、使用Stream流进行分类
  2.1.通过list.stream()拿到数据源
  2.2.进行数据处理操作:

//先定义两个条件
Predicate<User> predicate1 = user -> user.getAge()<21;
Predicate<User> predicate2 = user -> user.getSalary()>2000;
//然后利用这两个条件来筛选数据源(filter用于进行数据筛选)
list.stream()
		.filter(predicate1)
		.filter(predicate2)

  2.3.收集结果:
  使用collect(Collectors.toList())将上面操作的数据变为一个新的集合。总览如下:
Stream流操作_第2张图片
(亦可进一步简化)
Stream流操作_第3张图片
(下图这里使用or是或关系,使用and是且关系)
Stream流操作_第4张图片

使用Lambda表达式

 目的:为简化接口的编程方式
 例如,传统的面向接口的编程方式,首先要有一个实现类,如要创建一个线程,首先要写一个Runnable的实现类,写其run方法,然后定义一个线程将其传进来,再启动线程。
Stream流操作_第5张图片
Stream流操作_第6张图片
 ==》若要将其简化,可使用匿名内部类的方式(即不自定义MyRunnable):
Stream流操作_第7张图片
  可在上面的基础上继续简化,new Thred()内看似是一个对象,实则为一个方法的实现,因而可直接传方法的实现,而不需要外层的东西,故而直接使用lambda表达式:
Stream流操作_第8张图片
再进行简化:
Stream流操作_第9张图片
即使用Lamdba表示式时不再需要写类只需要写最核心的东西

将Lambda表达式应用在stream流中

eg:

//下问出现的str、num等都是可以随便写的,其含义是自定义一个变量,用于接收集合中的每一个元素

//1、filter
//先定义三个数据源
List<String> list = Arrays.asList("Hello","World","Java");
//拿到数据源并做处理
list.stream()
		.filter(str->str.length()>=5)
		.forEach(str->System.out.println(str));     //循环输出
//结果会输出 Hello  World


//2、limit
//用于指定元素不超过指定的数量,即进行截取
list.stream()
		.limit(2)          //这里是最大长度,即集合中最多两个
		.forEach(str->System.out.println(str));
//结果会输出 Hello  World

//3、sorted
//排序(默认升序排列)
List<Integer> list2  = Arrays.asList(1,6,2,3,5,4);
list2.stream()
		.sorted()
		.forEach(num->System.out.println(num));
//结果会输出 1 2 3 4 5 6 
//若要进行降序输出,只需给sorted加参数即可:
		.sorted(Comparator.reverseOrder())

//4、max、min、count
//求最大值,最小值、长度
//求最大值
System.out.println(list2.stream()
		.max(Integer::compareTo).get()); //按照Integer的排序把最大的求出来,此时所得的为Optional的对象,需用get()方法调出
//求最小值
System.out.println(list2.stream()
		.min(Integer::compareTo).get()); 
//求长度
System.out.println(list2.stream()
		.count()); 
//结果会输出 6  1  6

//5、map  
//对集合元素进行特定操作,然后传到map中
list2.stream()
		.map(num->num+10)		//对集合中每个元素进行加10操作
		.forEach(num->System.out.println(num));
//结果会输出 11 12 13 14 15 16

//6、reduce
//将所有元素按传入的逻辑进行处理,将结果合并成一个值进行返回
System.out.println(list2.stream()
		.reduce((sum,num)->sum+num).get());  //输出总和
//结果会输出 21

//7、collection
//基于目标集合生成新的集合(依据筛选条件)
List<Ingeter> collect = list2.stream()
		.filter(num->num%2==0)              //只取出偶数集合
		.collect(Collectors.toList());
System.out.println(collect);
//结果会输出 [6,2,4]

你可能感兴趣的:(java)