什么是Stream?
Stream是元素的集合,这点让Stream看起来类似Iterator。
可以把Stream当成一个高级版本的Iterator。原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的
Stream,用户只要给出对其包含的元素执行什么操作比如"过滤掉长度大于10的字符串"等,具体这些操作如何应用到每个元素上,就给Stream就好了。
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
Stream接口:不
1、是存储的数据结构,数据源可以是一个集合,为了函数式编程而创造。
2、惰式执行,数据只能被消费一次
两种类型的操作方法:
1、中间操作(生成一个Stream,继而可以继续调用Stream的方法)
2、结束操作(执行计算操作)
【看是中间操作还是结束操作,就看返回值是Stream就是中间操作,否则就是结束操作】
*/
public class StreamDemo {
public static void main(String[] args) {
Stream<String> stream = Stream.of("good","good","study","day","day","up");
//forEache遍历
stream.forEach(str->System.out.println(str)); //或者如下
stream.forEach(System.out::println);
//filter 过滤
//filter(Predicate<>)中间操作返回的是Stream,Predicate<>是返回的boolean值
stream.filter(s->s.length()>3).forEach(str->System.out.println(str));
//distinct 去重
//distinct()无参数,中间操作返回的是Stream
stream.distinct().forEach(str->System.out.println(str));
//map 映射,转大写后映射到一个新的流里;目的:当需要对原集合进行操作时,可以采用映射到新的流里,然后从新的流里对集合进行遍历
//map(Function<>)中间操作返回的是Stream;小括号里为Function<T,R>的lambda表达式
stream.map(s->s.toUpperCase()).forEach(str->System.out.println(str));
//flatMap 对两个集合进行映射到一个流里,然后对该一个流进行遍历
Stream<List<Integer>> ss = Stream.of(Arrays.asList(1,2,3),Arrays.asList(4,5,6));
ss.flatMap(list->list.stream()).forEach(s -> System.out.println(s));
//reduce 当要求最大值,最小值,求总和(聚合的时候)可调用
//stream.reduce(BinaryOperator<>)返回的是Optional类对象;小括号里为BinaryOperator<>的lambda表达式,需要传入两个参数
Optional<String> option = stream.reduce((s1,s2)->s1.length()>=s2.length()?s1:s2);
System.out.println(option.get());
//collect 可以把Stream转成List;同时List也可以转成Stream(因为List的父接口Collection已经实现了stream()方法可以直接调用转成Stream)
List<String> list = stream.collect(Collectors.toList());
list.forEach(str->System.out.println(str));
/**
::双引号表示方法的引用
引用静态方法: 如Integer::valurOf
引用对象的方法:如list::add
引用构造方法: 如ArrayList::new {相当于new ArrayList()}
*/
}
}