Java 8 Stream API

Java 8 Stream API

在学习Java8新特性的时候感觉很吃力,所以同以往一样,通过例子来学习StreamAPI
一.什么是流

这个流stream不同于输入输出流,可以把它想成一个’数据水流‘,Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了

二.具体例子代码

1.构造方法

@Test
    public void test1(){
        // 几种初始化Stream的方法       
        // 1.普通的Stream构造
        Stream stream = Stream.of("1","2","hello");
        //2.使用数组构造
        String [] s = new String[]{"he","llo"};
        Stream stream2 = Stream.of(s);
        //3.使用Collection进行构造
        List<String> list = new ArrayList<>(Arrays.asList(s));
        list.stream();
    }

2.操作类型

Intermediate:一个流可以后面跟随零个或多个 intermediate 操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。
Terminal:一个流只能有一个 terminal 操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal 操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。
Intermediate:

map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

Terminal:

forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

Short-circuiting:

anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

3.foreach操作

    @Test
    public void test2(){
        List<String> list = new ArrayList<>(Arrays.asList("1","2","hello"));
        list.stream().forEach(System.out::println);;
    }

4.Match操作

    @Test
    public void test3(){
        List<String> list = new ArrayList<>(Arrays.asList("hello","world","hello","java","hello","Stream"));
        boolean y = list.stream()
                        .anyMatch((x)->x.equals("hello"));
//      .allMatch((x)->x.equals("hello"));  所有都匹配返回true
//      .noneMatch((x)->x.equals("hello")); 。。
        System.out.println(y);

5.map操作

    public void test4(){
        List<String> list = new ArrayList<>(Arrays.asList("hello","world","hello","java","hello","Stream"));
        //  可以理解为一个元素到另一个不同元素的转化 也就是映射
        List<String> li = list.stream()
                              .map(s->s.toUpperCase())
                              .collect(Collectors.toList());    
        System.out.println(li.toString());
    }

6.flatMap操作

//The flatMap() operation has the effect of applying a one-to-many transformation to the elements of the stream, and then flattening the resulting elements into a new stream. 一对多关系,扁平化的结果
    @Test
    public void test5(){
        Stream<List<Integer>> inputStream = Stream.of(
                 Arrays.asList(1),
                 Arrays.asList(2, 3),
                 Arrays.asList(4, 5, 6)
                 );
                List<Integer> list = inputStream.
                flatMap((childList) -> childList.stream())
                .collect(Collectors.toList());
                ;
                System.out.println(list);
    }

最终 里面已经没有 List 了,都是直接的数字。

这里写图片描述

7.filter 和 sorted

    @Test
    public void test6(){
        List<people> list = new ArrayList<>();
        list.add(new people("zhangsan",32));
        list.add(new people("lisi",23));
        list.add(new people("wangwu",14));
        list.add(new people("zhaoliu",22));
        list.add(new people("tianqi",77));
        List l = list.stream()
            .filter((s)-> s.age> 30)
            //sorted 排序
//          .sorted((a,b)->a.getAge().compareTo(b.getAge()))
//          如同foreach语句 但是foreach语句是termimal 的 执行完之后不能有其他语句
            .peek((e)->System.out.println(e))
            .collect(Collectors.toList());
    }

8.reduce limit 和skip

    @Test
    public void test7(){
    //这个方法的主要作用是把 Stream 元素组合起来。它可以提供一个起始值(种子),然后依照运算规则,和前面 Stream 的第一个、第二个、第 n 个元素组合(计算)。
        int sum = Stream.of(1, 6, 3, 4).reduce(0, Integer::sum);
//      limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素
        List<String> s = Stream.of("Stringvalue","1","2","4").limit(3).collect(Collectors.toList());
        System.out.println(s.toString());
        Optional<Integer> x = Stream.of(5,2,4,6,3).reduce(Math::max);
        System.out.println(x.orElse(-1));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值