jdk8新特性之Stream

Java8新添加的Stream API真正的把函数式的编程风格引入到了Java中,有点类似于Mongodb的语法

即可以把操作的数据看成一个流,流在管道中进行传输,在节点上进行处理,筛选,排序,聚合等等。

数据源:流的来源,可以是集合(List,Set)、数组、I/O 、生产器Generator等

聚合操作:类似于SQL的一些操作,例如:filter、map、find、sorted、match等

Stream两个重要的特征:

1.Pipeling 中间操作都会返回流对象本身。这样多个操作串联成一个管道,如同流式风格
2.内部迭代:以前集合遍历都是Iterator或者Foreach等方式进行的外部迭代,Stream流提供了内部迭代的方式,通过访问者模式实现。

Stream流的创建: stream流有两种创建方式:

    1.stream()  为集合创建串行流
    2.parallelStream() 为集合创建并行流

forEach 遍历:

List<String> list = Arrays.asList("mysql", "java8", "tomcat", "spring", "mybatis", "springBoot");

list.stream().forEach(System.out::println);

遍历list的内容并进行打印

filter 通过filter的条件对流的元素进行过滤

List<String> list = Arrays.asList("mysql", "java8", "tomcat", "spring", "mybatis", "springBoot");

List<String> list = list.stream().filter(string->string.endsWith("s")).collect(Collectors.toList());

过滤以s结尾的元素

int count = list.stream().filter(string->string.endsWith("s")).collect(Collectors.toList()).count();

获取以s结尾元素的数量

map 用于映射到每个元素对应的结果

 List<Integer> intList = Arrays.asList(12, 11, 20, 20, 20, 20, 4, 9, 99, 35);

List<Integer> list = intList.stream().map(i -> i + 10).distinct().collect(Collectors.toList());

对集合中每个元素进行+10操作

limit 指定返回结果的数量

List<Integer> intList = Arrays.asList(12, 11, 20, 20, 20, 20, 4, 9, 99, 35);

List<Integer> list = intList.stream()limit(5).map(i -> i + 10).distinct().collect(Collectors.toList());

对集合每个元素+10操作,返回5条

sorted 对处理的元素进行排序

List<Integer> intList = Arrays.asList(120, 11, 20, 5, 20, 20, 4, 9, 99, 35);

List<Integer> list = intList.stream()limit(5).sorted().map(i -> i + 10).distinct().collect(Collectors.toList());

对集合每个元素+10操作,返回5条,并且返回的结果进行排序

parallelStream 并行处理

  List<String> list1 = Arrays.asList("2","","333","","","323","fa");

  long emptyCount = list1.parallelStream().filter(i->i.isEmpty()).count();
  
  获取空字符串的数量

Collectors 实现了很多规约操作,例如将流转换为集合或者字符串等等。

List<String> list = list.stream().filter(string->string.endsWith("s")).collect(Collectors.toList());
将流转化为List

String result = list.stream().limit(5).sorted().filter(i -> i.length() > 5).collect(Collectors.joining(", "));

将流转化为字符串

统计 一般用于集合中元素为int double long float 等数值类型,对其进行统计

    List<Integer> intList = Arrays.asList(12, 11, 20, 20, 20, 20, 4, 9, 99, 35);

    IntSummaryStatistics sum = intList.stream().mapToInt((x) -> x).summaryStatistics();

    System.out.println(sum);
    System.out.println(sum.getMax());
    System.out.println(sum.getAverage());
    System.out.println(sum.getMin());
    System.out.println(sum.getCount());

使用实例:

        List<ChapterEntity> chapterList = chapterMapper.findList(subjectId);
                
        RelationKnowledge condition = new RelationKnowledge(knowledgeId, subjectId, knowledgeName);
        List<RelationKnowledge> list = relationMapper.getKnowledgeListBySubject(condition);

        chapterList.stream().forEach(chapter -> {
            List<RelationKnowledge> tempList = list.stream().filter(relationKnowledge ->
                    chapter.getId().equals(relationKnowledge.getChapterId())
            ).collect(Collectors.toList());

            chapter.setRelationKnowledgeList(tempList);
        });

猜你喜欢

转载自my.oschina.net/u/2477500/blog/1615974