java8新特性stream流的使用(代码片段)

程序逸 程序逸     2022-12-06     216

关键词:

记录一下如何使用Stream流对象处理数据

使用三步骤:

  • 创建Stream流
  • 一系列对流的中间操作
  • 终止操作

创建Stream流的方式

  1. 通过Collection系类集合提供的stream()方法获取串行流或者parallelStream()方法获取并行流
		List<String> list = new ArrayList<>();
        Stream<String> stream = list.stream();
  1. 通过Arrays中的静态方法stream()方法获取数组流
		String[] strings = new String[10];
        Stream<String> stream1 = Arrays.stream(strings);
  1. 通过Stream流中的静态方法of()创建
Stream<String> a = Stream.of("a", "b", "c");
  1. 创建无限流
	//迭代
 	Stream.iterate(0, (x) -> x + 2).limit(10).forEach(System.out::println);
 	//生成
	Stream.generate(()->Math.random()).limit(5).forEach(System.out::println);

一系列对流的中间操作

筛选与切片

  1. filter:接收lambda,从流中排除某些元素。
//定义一个学生类方便演示,这里get,set方法自己添加
public class Student 
    private String name;
    private Integer age;


public class StreamDemo2 
    public static void main(String[] args) 
    //筛选年龄在30岁以上的
        List<Student> students = new ArrayList<>();
        students.add(new Student("a",12));
        students.add(new Student("b",42));
        students.add(new Student("c",52));
        students.add(new Student("d",22));
        students.add(new Student("e",182));

        students.stream().filter((s)->s.getAge()>30).forEach(System.out::println);
    


  1. limit----截断流,使其元素不超过指定的数量。
public class StreamDemo2 
    public static void main(String[] args) 
        List<Student> students = new ArrayList<>();
        students.add(new Student("a",12));
        students.add(new Student("b",42));
        students.add(new Student("c",52));
        students.add(new Student("d",22));
        students.add(new Student("e",182));
//筛选并且只显示一个
        students.stream().filter((s)->s.getAge()>30).limit(1).forEach(System.out::println);
    

  1. skip----跳过元素,返回一个扔掉前n个元素的流,如果剩下的不足n个,则返回空流,与limit互补
  2. distinct----通过流生成元素的hashCode()和equals()方法进行去重,但前提是元素要重写这两个方法。

映射

  1. map----接收lambda,将元素转化成其他元素或者提取信息。接收一个函数作为参数,改函数会作用到每一个元素,并将其映射成一个新元素。
public class StreamDemo3 
    public static void main(String[] args) 
       List<String> list = Arrays.asList("aaa","bbb","xxx","ccc","ddd");
       list.stream().map((s)->s.toUpperCase()).forEach(System.out::println);
        System.out.println("------------------------------------------------------");
        List<Student> students = new ArrayList<>();
        students.add(new Student("a",12));
        students.add(new Student("b",42));
        students.add(new Student("c",52));
        students.add(new Student("d",22));
        students.add(new Student("e",182));
        students.add(new Student("c",52));
        students.add(new Student("d",22));
        students.add(new Student("e",182));
        students.stream().map(Student::getName).forEach(System.out::println);
    

  1. flatMap----接收一个函数作为参数,将流中的每一个值都换成另外一个流,然后把所有流连接成一个流
public class StreamDemo3 
    public static void main(String[] args) 
       List<String> list = Arrays.asList("aaa","bbb","xxx","ccc","ddd");
       //不使用flatMap
       list.stream().map(StreamDemo3::filterCharacter).forEach((sm)->sm.forEach(System.out::println));
       //使用flatMap
        list.stream().flatMap(StreamDemo3::filterCharacter).forEach(System.out::println);
    

    public static Stream<Character> filterCharacter(String s)
        List<Character> list = new ArrayList<>();
        for (char c : s.toCharArray()) 
            list.add(c);
        
        return list.stream();
    

排序

  1. sorted()-----自然排序
  2. sorted(Comparator com)------定制排序
public class StreamDemo4 
    public static void main(String[] args) 
        List<String> list = Arrays.asList("ccc", "aaa", "vvv", "bbb", "ddd");
        //自然排序
        list.stream().sorted().forEach(System.out::println);
        System.out.println("----------------------------");
        List<Student> students = new ArrayList<>();
        students.add(new Student("a",12));
        students.add(new Student("b",42));
        students.add(new Student("c",52));
        students.add(new Student("d",22));
        students.add(new Student("e",182));
        students.stream().sorted((s1,s2)->
            if (s1.getAge().equals(s2.getAge()))
                return s1.getName().compareTo(s2.getName());
            else 
                return s1.getAge().compareTo(s2.getAge());
            
        ).forEach(System.out::println);

    

终止操作

查找和匹配

  1. allMatch-------是否匹配所有元素,返回true或者false。
  2. anyMacth-----是否至少匹配一个元素,返回true或者false。
  3. noneMatch----是否没有匹配所有的元素,返回true或者false。
  4. findFirst-------返回第一个元素。
  5. findAny-----返回当前流中的任意元素。
  6. count-----返回当前流中元素的总个数。
  7. max----返回流中最大值。
  8. min-----返回流中最小值。
public class StreamDemo5 
    public static void main(String[] args) 
        List<Student> students = new ArrayList<>();
        students.add(new Student("a",12));
        students.add(new Student("b",42));
        students.add(new Student("c",52));
        students.add(new Student("d",22));
        students.add(new Student("e",182));
        students.add(new Student("c",52));
        students.add(new Student("d",22));
        students.add(new Student("e",182));

        Optional<Student> max = students.stream().max((s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()));
        System.out.println(max.get());
        Optional<Integer> min = students.stream().map(Student::getAge).min(Integer::compare);
        System.out.println(min.get());
    

归约

  1. reduce-----可以将流中元素返回结合起来,得到一个值。其中参数第一个是起始值,第二个是运算符。
 List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Integer reduce = integers.stream().reduce(0, (x, y) -> x + y);
        System.out.println(reduce);

收集

  1. collect-------将流转换成其他形式,
       List<String> collect = students.stream().map(Student::getName).collect(Collectors.toList());
        collect.forEach(System.out::println);
        System.out.println("---------------------");
        Set<String> collect1 = students.stream().map(Student::getName).collect(Collectors.toSet());
        collect1.forEach(System.out::println);
        System.out.println("--------------------");
        HashSet<String> collect2 = students.stream().map(Student::getName).collect(Collectors.toCollection(HashSet::new));

        System.out.println("---------求平均数---------------");
        Double collect3 = students.stream().collect(Collectors.averagingInt(Student::getAge));
        System.out.println(collect3);

        System.out.println("---------求总和---------------");
        Integer collect4 = students.stream().collect(Collectors.summingInt(Student::getAge));
        System.out.println(collect4);

        System.out.println("---------求最大---------------");
        Optional<Student> collect5 = students.stream().collect(Collectors.maxBy((s1, s2) -> Integer.compare(s1.getAge(), s2.getAge())));
        System.out.println(collect5.get());

        System.out.println("---------求最小---------------");
        Optional<Integer> collect6 = students.stream().map(Student::getAge).collect(Collectors.minBy(Integer::compare));
        System.out.java8新特性stream流的使用(代码片段)

记录一下如何使用Stream流对象处理数据使用三步骤:创建Stream流一系列对流的中间操作终止操作创建Stream流的方式通过Collection系类集合提供的stream()方法获取串行流或者parallelStream()方法获取并行流 List<String>list=newArra... 查看详情

java8新特性stream流的使用(代码片段)

记录一下如何使用Stream流对象处理数据使用三步骤:创建Stream流一系列对流的中间操作终止操作创建Stream流的方式通过Collection系类集合提供的stream()方法获取串行流或者parallelStream()方法获取并行流 List<String>list=newArra... 查看详情

java8新特性stream流的应用

  在项目的代码编写中遇到这样一个问题。需要对关联方传递过来的列表数据进行一个筛选校验;把已经回调传递过来的数据给去掉。然后把没有回调过来的数据再接着进行处理。 问题大致分析如下:一个集合A包含多个... 查看详情

java8新特性_stream详解(代码片段)

之前写过一篇用stream处理map的文章,但是对stream没有一个整体的认识,这次结合并发编程网和ibm中介绍stream的文章进行一个总结,我会着重写对list的处理,毕竟实际工作中大家每天进行使用Stream简单介绍定义Asequenceofelementssupport... 查看详情

高效开发:jdk8新特性,流模式(代码片段)

文章目录一、前言二、Stream2.1为什么需要Stream2.2Java取代mysql完成聚合操作2.2.1Java7的先排序再取值实现2.2.2Java8的先排序再取值实现三、Stream总览3.1什么是流3.2流的构造与转换3.2.1流的构造3.2.2流的转换3.3流的三种操作IntermediateTermin... 查看详情

高效开发:jdk8新特性,流模式(代码片段)

文章目录一、前言二、Stream2.1为什么需要Stream2.2Java取代mysql完成聚合操作2.2.1Java7的先排序再取值实现2.2.2Java8的先排序再取值实现三、Stream总览3.1什么是流3.2流的构造与转换3.2.1流的构造3.2.2流的转换3.3流的三种操作IntermediateTermin... 查看详情

java8新特性----stream(代码片段)

Stream流WhatisStream?注意:Stream操作三部曲使用演示:中间操作筛选与切片内部迭代:迭代操作由StreamAPI完成终止操作:一次性执行全部内容,即惰性求值外部迭代limit===>短路skip===>跳过前n个元素distinct进行元素... 查看详情

java8的stream流的各种用法(代码片段)

...以由数组或集合创建,对流的操作分为两种2.Stream的特性3.Stream可以通过集合数组创建4.stream和parallelStream的简单区分案例1.遍历/匹配(foreach/find/match)2.筛选(filter)3.聚合( 查看详情

java8新特性3streamapi(代码片段)

一Stream1.1stream的概述stream是java8的新特性,用于操作java中list,set,map等存储结合中的元素。1.stream自己不会存储元素2.stream不会改变源对象,相反,他们会返回一个持有结果的新stream。3.stream操作是延迟执行的&... 查看详情

java8新特性之stream知识分享(代码片段)

优秀博客分享地址:点击进入:(侵权请联系删除)直奔主题1:构造数据集合importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;/***@authorxiexianxin*@create2021-12-0214 查看详情

java8新特性stream流操作详解及实战3(代码片段)

原文地址:java8新特性Stream流操作详解及实战3java8是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda,给我们操作集合(Collection)提供了极大的便利。本文主要介绍Stream的排序、去重、... 查看详情

java8新特性stream流操作详解及实战3(代码片段)

原文地址:java8新特性Stream流操作详解及实战3java8是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda,给我们操作集合(Collection)提供了极大的便利。本文主要介绍Stream的排序、去重、... 查看详情

乐字节-java8新特性-接口默认方法之stream流(下)

接上一篇:《Java8新特性之stream》,下面继续接着讲Stream  5、流的中间操作常见的流的中间操作,归为以下三大类:筛选和切片流操作、元素映射操作、元素排序操作:操作描述筛选和切片filter(T->boolean):保留boolean为true... 查看详情

java8新特性(代码片段)

java8新特性1.Lambda表达式1.Lambda表达式和方法引用的案例2.Lmabda表达式的6种形式3.Lambda表达式详细实例2.函数式接口1.函数式接口描述2.java内置四大函数式接口3.方法引用与构造器1.方法引用2.构造器引用4.StreamAPI1.StreamAPI说明2.stream实... 查看详情

java8新特性streamapi用法总结(代码片段)

前言  Stream作为Java8的一大亮点,它与java.io包里的InputStream和OutputStream是完全不同的概念。它也不同于StAX对XML解析的Stream,也不是AmazonKinesis对大数据实时处理的Stream。Java8中的Stream是对集合(Collection)对象功能的增强,它专... 查看详情

java8新特性stream流stream多字段排序(代码片段)

导语Java8API添加了一个新的抽象成为流Stream,它以一种声明的方式处理数据,最后由最终操做获得前面处理的结果。Stream专一于集合对象的操做,将要处理的元素集合看做一种流,流在管道中传输,而且能够在... 查看详情

关于java8新特性stream的一些思考(代码片段)

虽然学了很多Stream的用法,但有时候发现,凡事都有两面性,也不是所有的情况都适用,下面看几个例子示例1BusistatusInfo[]saveInfos=infoVO.getSaveInfos();String[]ids=newString[saveInfos.length];for(inti=0;i<sav 查看详情

浓缩精华版java8新特性(代码片段)

目录一、Lambda1、定义/设计原因2、结构3、规则4、使用二、函数式接口1、定义2、设计原因3、使用三、方法引用1、定义/设计原因2、使用四、接口的默认方法1、定义2、设计原因3、使用五、Stream1、定义2、设计原因2、使用六、Opti... 查看详情