package com.dudu.java8.read;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* 第二部分 函数式数据处理
* 4 引入流
* @create: 20190327
* @author: liu
**/
public class Read4 {
public static void main(String[] args) {
/**
* 允许以声明性方式处理数据集合
* 还可以透明的进行并行处理
*
*
* @create: 2019-03-27
* @author: liu
**/
List<String> dogs= Arrays.asList(new Dog("a",12),new Dog("c",5),new Dog("s",8), new Dog("q",2))
.stream()
.filter(x -> x.getAge() >3)
.sorted(Comparator.comparing(Dog::getAge))
.map(Dog::getName)
.collect(Collectors.toList());
//还可以使用group进行分组
System.out.println(dogs);
/**
* 代码以声明性方式写:说明想要完成什么,而不是说明如何实现
* 可以把几个基础操作连接起来,表达复杂的数据处理流水线
* 其他的类库 guava lamdbaj
*
* 流简介
* 从支持数据处理操作的源生成的元素序列
* 元素序列:
* 像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值
* 源:
* 流会使用一个提供数据的源,如集合、数组或输入、输出资源。有序集合生成流时会保留原有的顺序
* 数据处理操作:
* 流的数据处理功能支持类似于数据库的操作,以及函数式编程语言中的常用操作
* 流水线:
* 内部迭代:
*
* 常见的流操作简介
* filter 接收lambda 进行筛选操作
* map 进行信息的提取
* limit 截断,进行一部分的数据截取
* collect 将流转换为其他形式
*
* @create: 2019-03-27
* @author: liu
**/
/**
* 流和集合提供了接口,来配合代表元素型有序值的数据接口,一般是按顺序取用值
* 集合和流之间的差异就在于什么时候进行计算,
* 集合是内存中的数据结构
* 流在概念上固定的数据结构,不能添加或删除元素,元素是按需计算的
* 流只能遍历一次
* @create: 2019-03-27
* @author: liu
**/
/**
* 外部迭代与内部迭代
* 使用Collection接口需要用户去做迭代,foreach等 称为外部迭代
* Streams库使用内部迭代,帮你做迭代
*
* 内部迭代时,项目可以透明地并行处理
* foreach需要自己处理并行的问题
*
* 流操作
* 可以连接起来的流操作称为中间操作,关闭流的操作称为终端操作
*
* 中间操作会返回另一个流,,除非流水线触发一个终端操作,否则中间操作不回执行任何处理
*
* 尽管filter 和map是两个独立的操作,但是他们合并到同一次遍历中,这种技术,叫做循环合并
*
*
* 使用流:
* 一个数据源来执行一个查询
* 一个中间操作链,形成一条流的流水线
* 一个终端操作,执行流水线,并能生成结果
* @create: 2019-03-27
* @author: liu
**/
}
}
class Dog {
private String name ;
private int age ;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
![[log]java8实战流操作基本概念 [log]java8实战流操作基本概念](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU0NC8xMzhjM2UyZTgyMTdhZGFlZGI1MDgzNDUyOTJlZjUxMC5wbmc=)