java之Stream

Stream

Stream 是jdk1.8提供的新特性,主要用于集合的迭代处理解决方案

类似于Iterator 迭代器,但是功能更加强大

iterator主要功能:
	主要用于集合的遍历
	Collectin<E> coll = new ArrayList<E>();
	coll.add("aaa");
	coll.add("bbb");
Iterator it = coll.Iterator();
while (it.hasNext()) {//判断是否具有下一个元素,如果有的话返回true
//next() 方法获取下一个元素
String 

}

		String str = it.next();
	}

	//for循环
		普通for循环
		for-each
	//迭代循环
		Iterator

Lambda表达式:
	([参数列表])->{
		语句块
	}
	主要用于接口的实现:
	1.集合中有一个抽象方法
	2.@FunctionalInterface检查该接口符不符合使用lambda表达式

@FunctionalInterface
Interface Iservice{
	public int add(int i,int j);
}
通过lambda表达式进行实现:
	IService is = (i,j)-> i+j;
	is.add(100,200);

Stream对象的创建:

1.通过集合的stream()方法进行创建
	List<Integer> list = new ArrayList<Integer>();
	list.add(111);
	list.add(222);
	list.add(333);
	//对list创建了一个stream的流化数据
	Stream stream = list.stream();

2.通过数组的工具类Arrays的stream()方法进行创建
	String[] strs = {"aaa","bbb","ccc","ddd"};
	Stream stream = Arrays.stream(strs);
	stream.forEach(System.out::println):
3.通过Stream自身静态方法进行创建
	static of(t)方法:
4.IntStream.Range(1,10); 创建整形数组流
5.Randow rm = new Random().ints(10,1,100); 创建随着生成的整形数组流

Stream的迭代:

分类:
外部迭代:
	串行迭代:单线程运行
内部迭代:
	并行迭代:多线程运行

Lambda表达式:函数式接口

主要作用:
对接口中的抽象方法提供直接重写实现。

接口中的抽象方法一般需要通过实现类来进行重写,但是这种方法比较麻烦,
jdk1.8提供了新的实现方式Lmabda表达式。

Interface IService{
	public int add(int i,int j);
}
实现方式一:
	通过实现类进行重写。
public class IServiceImpl implements Iservice{
	public int add(int i,intj){
		return i + j;
	}
}

public static void main(String[] args){
	Iservice is = new IserviceImpl();
	is.add(5,8);
}
实现方式二:
public static void main(String[] args){
	Iservice is = new Iservice{
		public int add(int i, intj){
			return i+j;
		}
	};
}

实现方式三:
通过lambda表达式进行实现:
语法:
	([int i,int j])->{
		return i+j;
	}
什么样的接口能够使用lambda表达式:
1.接口里只有一个抽象方法
2.@FunctionalInterface注解:主要作用是检测该接口是否可以使用lambda表达式

Lambda表达式的使用:
	IService is = (int i, int j)->{
		return i+j;
	};
	int sum = is.add(5,8);


	简写规则:
	1.参数类型可以省略不写,只写参数名称
	2.当语句块只有一句话的时候,可以省略大括号不写,return 关键字也不用写
	简写实例:
	IService is = (i,j)-> i + j;

Stream的操作:

无状态操作:
	通过相关方法如map,filter等方法的对流进行操作但是不改变流的内部元素,称为无状态操作。
有状态操作:
	通过distinct,sorted等方法的操作,会改变流内元素,生成新的流对象的操作,称为有状态的操作。


常用方法:
	1.distinct()去重复项的方法
	直接使用流对象进行调用。
	stream.distinct();

	2.filter(lambda);过滤方法

	3.map(lambda)方法:类型转换

	4.mapToInt(lambda); 类型转换

	5.mapToLong(lambda); 类型转换

	6.mapToDouble(lambda);类型转换

	7.flatMap(lambda); 当数组中的元素还是数组的话,可以同flatMap方法提取出来,合并形成新的流。
		
	  String[] ss={"a b c d","1 2 3 4","e f g h","5 6 7 8"};

	  Stream.of(ss).map(s->s.split(" ")).flatMap(Arrays::stream).forEach(System.out::println);
	8.peek()方法:作用是使用peek方法产生一个新的stream流对象,并且在执行peek方法中的lambda表达式的
	  时候,或逐一调用新的stream流中每一个元素。

	9.limit(int n)方法:作用截取Stream流中的前n个元素
	  比如:stream流对象中有10个元素,limit(5):获取流中的前5个元素
	10.skip(int n)方法:用于抹去前n个元素,获取n后面的元素
	  比如:stream流对象中有10个元素,skip(5):获取流中的从第六个元素开始后面的所有元素
	
	11.reduce方法:把流里面的元素进行归一化处理,比把连个元素进行拼接。

Stream的惰性求值:

什么是惰性求值:
	在方法声明之后,如果没有最终使用它的话,不执行中间操作,等需要使用的时候再加载。
惰性求值的好处:
	在注册的时候不执行操作,在使用的时候再执行中间操作:提高程序的运行效率。

Optional类:
final:最终类
直接继承Object类
作用:规避大部分的空指针 NullPointException异常
位置:用于方法的返回值或取值运算中

构造方法:无
	
Optional实例化:
	Optional.of([参数]);
		参数:不予许为空
	Optional.ofNullable(参数);
		参数:允许为空
	Optional.empty();
		返回空的Optional对象:Optional.empty
常用方法:
	get():获取Optional对象中的值
	orElse(参数); 当结果为空值的时候返回一个指定参数默认值
	orElseGet(lambda) 如果optional2为空值,可以调用一个lambda表达式
	orElseThrow(lambda) 如果optional2为空值则调用返回指定的异常

	filter()过滤方法,如果Optional对象满足filter指定的条件则返回数据,否则返回空
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值