欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java jdk8 中的stream 用法

程序员文章站 2022-06-04 19:54:13
...

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

 实际运用如下

package com.example.demo.util.shiyan;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.pojo.ResponseObject;
import com.example.demo.util.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;
import java.util.stream.Collectors;
public class Test {
    public static void main(String args[]){
        streamLianxi();
        test1();
    }
    public static void streamLianxi(){
        List<Student> list = new ArrayList<>();
        Student student1 = new Student();student1.setAge("12");student1.setSex(0);student1.setName("拉拉");
        Student student2 = new Student();student2.setAge("13");student2.setSex(2);student2.setName("嘿嘿");
        Student student3 = new Student();student3.setAge("11");student3.setSex(1);student3.setName("秀秀");
        Student student4 = new Student();student4.setAge("18");student4.setSex(1);student4.setName("天天");
        Student student5 = new Student();student5.setAge("18");student5.setSex(0);student5.setName("小白");
        Student student6 = new Student();student6.setAge("18");student6.setSex(2);student6.setName("小美");
        Student student7 = new Student();student7.setAge("18");student7.setSex(2);student7.setName("小明");
        Student student8 = new Student();student8.setAge("12");student8.setSex(1);student8.setName("小丁");
        list.add(student1);
        list.add(student2);
        list.add(student3);
        list.add(student4);
        list.add(student5);
        list.add(student6);
        list.add(student7);
        list.add(student8);
        list.forEach(System.out::println);
        //过滤年龄大于13的学生
        List<Student> list2=list.stream().filter(student -> new Integer(student.getAge())>13).collect(Collectors.toList());
        list2.forEach(student->{
            System.out.println(student.getAge());
        });
        System.out.println("-----------------------------------");
        //打印性别为0的人
        List<Student> list3=list.stream().filter(student -> Integer.valueOf(student.getSex())==0).collect(Collectors.toList());
        list3.forEach(student->{
            System.out.println(student.getAge());
        });
        System.out.println("-----------------------------------");
        //多条件排序
        List<Student> list4=list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
        list4.forEach(student->{
            System.out.println(student.getAge());
        });
        System.out.println("-----------------------------------");
        //多条件倒叙排序
        List<Student> list5=list.stream().sorted(Comparator.comparing(Student::getAge).reversed().thenComparing(Student::getSex)).collect(Collectors.toList());
        list5.forEach(student->{
            System.out.println(student.getAge()+" "+student.getSex());
        });
        System.out.println("-----------------------------------");
        Map<String, List<Student>> groupBy = list.stream().collect(Collectors.groupingBy(Student::getAge));
        System.out.println(groupBy);
        Set<String> idSet=groupBy.keySet();
        for (String id:idSet) {
            System.out.println(id+groupBy.get(id));
        }
        System.out.println("获取key的值"+groupBy.keySet());
        System.out.println(" "+groupBy.get("11").get(0).getName());
    }
static void test1(){
        List<Double> cost = Arrays.asList(10.0, 30.0,20.0);
        System.out.println("=============foreach循环=============");
        cost.stream().forEach(x->{
            if(x==10.0){
                x=1.0;
            }
        });
        cost.stream().forEach(System.out::println);
        System.out.println("=============map成为新的对象=============");
        cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
        System.out.println("=============reduce计算总和=============");
        double arraysSum=cost.stream().map(x -> x*10).reduce((sum,x)->sum+x).get();
        System.out.println("arraysSum"+arraysSum);
        System.out.println("=============filter筛选=============");
        List<Double> list=cost.stream().filter(x->x>10).collect(Collectors.toList());
        list.stream().forEach(System.out::println);

    }
}

运行结果
 

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
18
18
18
18
-----------------------------------
12
18
-----------------------------------
11
12
12
13
18
18
18
18
-----------------------------------
18 0
18 1
18 2
18 2
13 2
12 0
12 1
11 1
-----------------------------------
{11=[[email protected]], 12=[[email protected], [email protected]], 13=[[email protected]], 18=[[email protected], [email protected], [email protected], [email protected]]}
11[[email protected]]
12[[email protected], [email protected]]
13[[email protected]]
18[[email protected], [email protected], [email protected], [email protected]]
获取key的值[11, 12, 13, 18]
 秀秀
=============foreach循环=============
10.0
30.0
20.0
=============map成为新的对象=============
10.5
31.5
21.0
=============reduce计算总和=============
arraysSum600.0
=============filter筛选=============
30.0
20.0