六、Stream流

1、 什么是stream流

现阶段,可以把stream流看成一个高级版的Iterator。普通的Iterator只能实现遍历,遍历做什么,就需要具体些功能代码函数了。而这个stream可以实现一些遍历常见的功能(例如:非空、求最大值、遍历打印等)

2、 效率高吗?

采用lazy模式(懒处理模式),所有操作最后一起执行,在一次循环中结束。

3、 创建stream流

1) list集合

list对象.stream()即可

2) 数组

Arrays.stream(数组对象)

或者

Stream.of(数组对象)

4、 常见的方法

例如:

package com.lennar.jdk8learn.learn;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class LeanStream {

@Test
    public void test1() {
        List<String> list
= new ArrayList<>();
        String[] strings = new String[10];
        for (int i = 0; i < 10; i++) {
            list.add(String.valueOf(i));
            strings[i]
= String.valueOf(i);
        }

//创建流stream
        Stream listStream
= list.stream();
        Stream arrayStream
= Arrays.stream(strings);
        Stream arrayStream2
= Stream.of(strings);
        //forEach遍历方法
        listStream.forEach(System.out::println);
        System.out.println("---------------");
        arrayStream.forEach(System.out::println);
        System.out.println("---------------");
        arrayStream2.forEach(System.out::println);
        System.out.println("---------------");
    }

@Test
    public void test2() {
        Student student1 = new Student("1", "张三", "唐山");
        Student student2 = new Student("2", "李四", "唐山");
        Student student3 = new Student("3", "王五", "北京");
        Student student4 = new Student("4", "赵六", "杭州");
        List<Student> list
= new ArrayList<>();
        list.add(student1);
        list.add(student1);
        list.add(student2);
        list.add(student3);
        list.add(student4);
        //collect方法:将Steam流转换成list、set、map
        List<Student> newList
= list.stream().collect(Collectors.toList());
        System.out.println(newList);
        Set<Student> set = list.stream().collect(Collectors.toSet());//去重
        System.out.println(set);
        //Collectors.toMap(获取key的方法,获取value的方法,key相同时的方法)
        Map<String, Student> map = list.stream().collect(Collectors.toMap(Student::getName, student -> student, (k1, k2) -> k1));//name作key,student对象作value,键相同则取前者。
        System.out.println(map);
        Map<String, Student> map2 = list.stream().collect(Collectors.toMap(Student::getId, student -> student, (k1, k2) -> k1));
        System.out.println(map2);
        Map<String, Student> map3 = list.stream().collect(Collectors.toMap(Student::getAddress, student ->
student, (k1, k2)
-> k2));
        System.out.println(map3);
        //Collectors.groupingBy(获取分组key的方法)
        Map<String, List<Student>>
groupMap = list.stream().collect(Collectors.groupingBy(Student::getId));
        System.out.println(groupMap);
        Map<String, List<Student>>
groupMap2 = list.stream().collect(Collectors.groupingBy(Student::getName));
        System.out.println(groupMap2);
        Map<String, List<Student>>
groupMap3 = list.stream().collect(Collectors.groupingBy(Student::getAddress));
        System.out.println(groupMap3);
        //最大max(里面本质就是一个Comparator的方法)、最小min(里面本质就是一个Comparator的方法)
        //Comparator.comparing(获取要比较的属性的方法)
        Optional<Student> minStudentOptional = list.stream().min(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return -o1.getId().compareTo(o2.getId());
            }
        });
        Student minStudent = minStudentOptional.get();
        System.out.println("min:" + minStudent);
        Optional<Student> maxStudentOptional = list.stream().max(Comparator.comparing(Student::getId));
        Student maxStudent = maxStudentOptional.get();
        System.out.println(maxStudent);
        //排序sorted(里面本质就是一个Comparator的方法)
        List<Student> students
= list.stream().sorted(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return -o1.getId().compareTo(o2.getId());
            }
        }).collect(Collectors.toList());
        System.out.println(students);
        List<Student> students2
= list.stream().sorted(Comparator.comparing(Student::getId)).collect(Collectors.toList());
        System.out.println(students2);
        //过滤filter(里边返回一个boolean类型数据就行)
        List<Student> filterList
= list.stream().filter(student
-> {
            boolean flag = false;
            if (!student.getAddress().equals("唐山")) {
                flag = true;
            } else {
                if (!student.getId().equals("1")) {
                    flag = true;
                }
            }
            return flag;
        }).collect(Collectors.toList());
        System.out.println(filterList);
        //limit(n),仅仅研究前n个
        List<Student> limitList
= list.stream().limit(2).collect(Collectors.toList());
        System.out.println(limitList);
        //skip(n),跳过前n个
        List<Student> skipList
= list.stream().skip(2).collect(Collectors.toList());
        System.out.println(skipList);
        //distict(),去重
        List<Student> distinctList
= list.stream().distinct().collect(Collectors.toList());
        System.out.println(distinctList);
        //map(把原内容变成新内容的方法)
        List<String> nameList
= list.stream().map(student
-> student.getName()).collect(Collectors.toList());
        System.out.println(nameList);
        //allMatch(匹配方法lambda表达式),都匹配返回true;对每一个元素判断,最后取交集
        Boolean f1 = list.stream().allMatch(student
-> {
            boolean flag = false;
            if (null == student.getName()) {
                flag = true;
            }
            return flag;
        });
        System.out.println(f1);
        //anyMatch(匹配方法lambda表达式),有元素匹配返回true;对每一个元素判断,最后取交集
        boolean f2 = list.stream().anyMatch(student
-> {
            boolean flag = false;
            if ("张三".equals(student.getName())) {
                flag = true;
            }
            return flag;
        });
        System.out.println(f2);
        //noneMatch(匹配方法lambda表达式),都不匹配返回true;对每一个元素判断,最后取交集
        boolean f3 = list.stream().noneMatch(student
-> {
            boolean flag = false;
            if ("唐山".equals(student.getAddress())) {
                flag = true;
            }
            return flag;
        });
        System.out.println(f3);
    }

@Test
    public void test3() {
        List<Integer> list
= new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            list.add(i);
        }
        IntSummaryStatistics collect = list.stream().collect(Collectors.summarizingInt(value -> value));
        System.out.println(collect.getSum());
        System.out.println(collect.getMax());
        System.out.println(collect.getMin());
        System.out.println(collect.getAverage());
        System.out.println(collect.getCount());

List<Double> list2
= new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            list2.add((double) i);
        }
        DoubleSummaryStatistics collect2 = list2.stream().collect(Collectors.summarizingDouble(value -> value));
        System.out.println(collect2.getSum());
        System.out.println(collect2.getMax());
        System.out.println(collect2.getMin());
        System.out.println(collect2.getAverage());
        System.out.println(collect2.getCount());
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Student {
    private String id;
    private String name;
    private String address;
}

(六)jdk8学习心得之Stream流的更多相关文章

  1. JDK8新特性关于Stream流

    在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: 1 2 3 ...

  2. (一)jdk8学习心得之遍历

    一.遍历 -- 最好和stream流连用 使用jdk8提供的forEach进行遍历时,采用的是多线程的操作,理论上讲是会比原来的方法更快.但是注意,系统启动时需要加载lambda框架的内容.因此如果通 ...

  3. Lambda学习总结(二)--Stream流

    一.Stream 流 1.1 概念 官方解释:可以支持顺序和并行对元素操作的元素集合. 简单来讲,Stream 就是 JDK8 提供给我们的对于元素集合统一.快速.并行操作的一种方式. 它能充分运用多 ...

  4. (七)jdk8学习心得之join方法

    七.join方法 1. 作用:将list或者数组按照连接符进行连接,返回一个字符串. 2. 使用方法 1) String.join(“连接符”,数组对象或者list对象) 2) 首先转换成stream ...

  5. JDK8新特性之Stream流

    是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西. 流可以简单的说是处理数据集合的东西,可以申明式流式A ...

  6. 20165221—JAVA第六周学习心得

    课本知识点小结 第8章:常用实用类 String类 常量对象放入常量池中,而用string声明的对象变量中存放着引用.凡是new构造的常量都不在常量池中. startIndex表示提取字符的起始位置, ...

  7. (八)jdk8学习心得之Optional类

    八.Optional 类 1. 作用:可以存放空指针null,主要用于解决空指针问题. 2. 使用方法 1) 创建对象(2种方法) Optional optional = Optional.of(非n ...

  8. (五)jdk8学习心得之默认方法

    五.默认方法 1. 使用方法:写在接口中,就是为了接口可以做一些事情. 2. 目的:有很多实现类,有一个公共的抽象方法,其实这些实现类实现该抽象方法的内容是完全一致的,完全没有必要都重新实现一遍.并且 ...

  9. (四)jdk8学习心得之函数式接口

    四.函数式接口 1. 格式 注:抽象方法就是通过lambda表达式或者方法引用实现. 2. Jdk提供的函数式接口(这里提供五个最为常用的) 3. 技巧 通过函数式接口,就可以把一个函数作为一个参数进 ...

随机推荐

  1. Java读取excel表,getPhysicalNumberOfCells()和getLastCellNum区别

    excel表存入数据库,发现有时报数组下标越界异常.调试发现用了 getPhysicalNumberOfCells(),这个是用来获取不为空的的列个数. getLastCellNum是获取最后一个不为 ...

  2. 安恒杯 3月线上个人赛WriteUp

    #前言 这次做的还挺多的,只有个Web300没做出来,排名由上次60+进步到这次16名(最后三分钟掉了5名),感觉还是不错的.但是很明显,流量题有很大的运气成分.做完流量题之后还剩一个多小时,水了水M ...

  3. FileUtils【获取SD卡根目录、读写文件、移动、复制、删除文件、获取文件名、后缀名操作类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装了获取SD卡根目录路径.以及对文件读写.获取文件名等相关操作. 因为需要用到android.permission.READ_EX ...

  4. Netty源码 服务端的启动

    最近一直在看netty,看完之后就想做点笔记.可是实在是太忙了,挤了还要几个晚上终于挤出来了 上图是服务端的实例代码.大致的流程先梳理一遍. 首先会执行 用于创建两个线程组,boosGroup用于接受 ...

  5. c# 获取当前时间的微秒

    获取毫秒大家都经常用到. 大家应该都知道怎么用. 但是,毫秒下面还有微秒. 其实这个方法也已经在c#中. 只不过很少有人用到,所以查找资料也很少有人说. 下面代码就是获取微秒的方式: DateTime ...

  6. vue项目使用MD5进行密码加盐

    首先给项目安装MD5模块:npm install --save js-md5 使用方法有两种: 使用方法1:  在需要使用的项目文件中引入MD5:import md5 from 'js-md5'; 使 ...

  7. keil进阶教程

    前言 keil只懂得创建软件工程是远远不够的,如果要想顺心使用,应该要懂得部分配置,这样使用心情顺畅,码代码也会越发高效. 设置字号字体 编辑点击编辑菜单,会出现很多子目录,找到配置,点击进入设置页面 ...

  8. webpack-插件机制杂记

    系列文章 Webpack系列-第一篇基础杂记 webpack系列-插件机制杂记 前言 webpack本身并不难,他所完成的各种复杂炫酷的功能都依赖于他的插件机制.或许我们在日常的开发需求中并不需要自己 ...

  9. MySQL 笔记整理(10) --MySQL为什么有时会选错索引?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 10) --MySQL为什么有时会选错索引? MySQL中的一张表上可以 ...

  10. SQLServer存储过程编写规则

    SQLServer编写规则 1.  存储过程 a)         在程序应用中,对于数据库“写”操作的功能通过存储过程来实现. b)        存储过程命名: SP_+表名(+功能名) 对于一个 ...