JDK1.8的Stream接口

什么是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()}
        
        */
        
        
        
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_34419321/article/details/87073893