栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

stream

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

stream

stream

1.是什么

stream是java8中处理集合的关键抽象概念,对集合进行操作

使用声明式编程来处理集合的java接口,可以看作遍历数据集的高级迭代器。

  • 集合是内存中的数据结构,所有的值都是已经计算好的;
  • 流是一个概念上的数据结构,它的元素都是在使用到的时候才计算出来的。
  • 集合是关于数据的,流是关于计算的;
  • 集合是外部迭代,(外部迭代就是每次操作都要迭代一次);流是内部迭代,所有操作只需要一次操作。
  • 集合可以多次使用,就像DVD;流只能使用一次,就像直播

2.为什么使用它

使用stream api 对集合进行操作,就像使用 sql 对数据库进行查询。stream api 提供了一种高效且易于使用的处理数据的方式

3.怎么使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kqDjpMm2-1653960312383)(C:Userspengzhang1Desktop学习2stream.jpg)]

分类

stream 操作分类

  • 中间操作

    • 无状态
    unordered(),filter(),map(),mapToInt(),mapToLong(),mapToDouble(),flatMap(),flatMapToInt(),flatMapToLong(),flatMapToDouble(),peek()
    
    • 有状态
    distinct(),sorted(),limit(),skip()
    
  • 约束操作

    • 非短路操作
    forEach(),forEachOrdered(),toArray(),reduce(),collect(),max(),min(),count()
    
    • 短路操作
    anyMatch(),allMatch(),noneMatch(),findFirst(),findAny()
    

    无状态:指元素的处理不受之前元素的影响

    有状态:指该操作只有拿到所有元素之后才能继续下去

    非短路操作:指必须处理所有元素才能得到最终结果

    短路操作:指遇到某些符合条件的元素就可以的得到最终的结果

具体使用 流的创建
package com.zp.demo1;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Stream;


public class streamdemo1 {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public streamdemo1(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public streamdemo1() {
    }

    @Override
    public String toString() {
        return "streamdemo1{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }

    public static void main(String [] args) throws FileNotFoundException {


        //1.使用collection 下的stream()和parallelStream()方法
        ArrayList list = new ArrayList<>();
        Stream stream = list.stream();//获取一个顺序流
        Stream parallelStream = list.parallelStream();//获取一个并行流

        //2.使用Arrays中的stream()方法,将数组转换成流
        Integer[] integers = new Integer[10];
        Stream stream1 = Arrays.stream(integers);

        //3.使用stream中的静态方法,of(),iterator(),generate()
        Stream integerStream = Stream.of(1, 2, 3, 4, 5);//of()方法

        Stream stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
        stream2.forEach(System.out::println);//iterate()方法

        Stream stream3 = Stream.generate(Math::random).limit(3);
        stream3.forEach(System.out::println);//generate()方法

        //4.BufferedReader.lines()方法,将每行内容转化成流
        BufferedReader bufferedReader = new BufferedReader(new FileReader("E:\test.txt"));
        Stream linesStream = bufferedReader.lines();
        linesStream.forEach(System.out::println);

        //5.Pattern.splitAsStream()方法,将字符串分隔成流
        Pattern patter = Pattern.compile(",");
        Stream stringStream = patter.splitAsStream("a,b,c,d");
        stringStream.forEach(System.out::println);

    }
}

中间操作
package com.zp.demo1;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;


public class streamdemo2 {
    public static void main(String[] args){

        
        Stream integerStream = Stream.of(1, 1, 2, 2, 3, 3, 4, 5, 6, 7);
        Stream integerStream1 = integerStream.filter(s -> s > 1)//把小于1的过滤了
                .distinct()//去重
                .skip(3)//从2开始跳过3个
                .limit(2);//只显示两个
        integerStream1.forEach(System.out::println);


        

        List strings = Arrays.asList("a,b,c", "1,2,3");

        //map
        //将每一个元素转换成一个新的且不带逗号的元素
        Stream stringStream = strings.stream().map(s -> s.replaceAll(",", ""));
        stringStream.forEach(System.out::println);

        //flatMap
        Stream stream3 = strings.stream().flatMap(s -> {
            //将每一个元素转换成一个stream
            String[] split = s.split(",");
            Stream stream = Arrays.stream(split);
            return stream;
        });
        stream3.forEach(System.out::println);


        

        List strings1 = Arrays.asList("aa", "bb", "ff", "cc");
        strings1.stream().sorted().forEach(System.out::println);

        streamdemo1 s1 = new streamdemo1("aa",10);
        streamdemo1 s2 = new streamdemo1("cc",11);
        streamdemo1 s3 = new streamdemo1("bb",13);
        streamdemo1 s4 = new streamdemo1("aa",12);
        streamdemo1 s5 = new streamdemo1("ee",14);
        List streamdemo1s = Arrays.asList(s1, s2, s3, s4, s5);

        //自定义排序,先按姓名升序,姓名相同后按年龄
        streamdemo1s.stream().sorted(
                (o1,o2)->{
                    if (o1.getName().equals(o2.getName())){
                        return o1.getAge() - o2.getAge();
                    }else{
                        return o1.getName().compareTo(o2.getName());
                    }
                }
        ).forEach(System.out::println);

        

        streamdemo1 streamdemo1 = new streamdemo1("aa",12);
        streamdemo1 streamdemo2 = new streamdemo1("aa",11);
        List streamdemo1s1 = Arrays.asList(streamdemo1, streamdemo2);

        streamdemo1s1.stream().peek(o->o.setAge(100)).forEach(System.out::println);

        
        List arrayList =Arrays.asList(1, 2, null, 3,2, null, 3, 4, 5, 6, 7,8);
        System.out.println("sum is:"+arrayList.stream().filter(num -> num != null)
            .distinct().mapToInt(num -> num * 2)
                .peek(System.out::println).skip(2).limit(6).sum()
        );


    }

}

终端操作
package com.zp.demo1;

import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Collectors;

public class streamdemo3 {
    public static void main(String [] args){

        
        List integers = Arrays.asList(1, 2, 3, 4, 5);
        boolean allMatch = integers.stream().allMatch(e -> e > 10);
        boolean noneMatch = integers.stream().noneMatch(e -> e > 6);
        boolean anyMatch = integers.stream().anyMatch(e -> e > 4);
        System.out.println("allMatch:"+allMatch);
        System.out.println("noneMatch:"+noneMatch);
        System.out.println("allMatch:"+anyMatch);

        Integer findFirst = integers.stream().findFirst().get();
        Integer findAny = integers.stream().findAny().get();
        System.out.println("findFirst:"+findFirst);
        System.out.println("findAny:"+findAny);

        long count = integers.stream().count();
        Integer max = integers.stream().max(Integer::compareTo).get();
        Integer min = integers.stream().min(Integer::compareTo).get();
        System.out.println("count:"+count);
        System.out.println("max:"+max);
        System.out.println("min:"+min);

        
        List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24);
        Integer reduce1 = list.stream().reduce((x1, x2) -> x1 + x2).get();
        System.out.println("reduce1:"+reduce1);
        Integer reduce2 = list.stream().reduce(10, (x1, x2) -> x1 + x2);
        System.out.println("reduce2:"+reduce2);
        Integer reduce3 = list.stream().reduce(0,
                (x1, x2) -> {
                    System.out.println("stream accumulator:x1:" + x1 + " x2:" + x2);
                    return x1 - x2;
                },
                (x1, x2) -> {
                    System.out.println("stream combiner: x1:" + x1 + "  x2:" + x2);
                    return x1 * x2;
                });
        System.out.println("reduce3:"+reduce3);
        Integer reduce4 = list.parallelStream().reduce(0,
                (x1, x2) -> {
                    System.out.println("parallelStream  accumulator: x1:" + x1 + "   x2:" + x2);
                    return x1 - x2;
                },
                (x1, x2) -> {
                    System.out.println("parallelStream combiner: x1:" + x1 + "  x2:" + x2);
                    return x1 * x2;
                });
        System.out.println("reduce4:"+reduce4);

        
        streamdemo1 a1 = new streamdemo1("aaa", 10);
        streamdemo1 b1 = new streamdemo1("bbb", 11);
        streamdemo1 c1 = new streamdemo1("ccc", 12);
        List list2 = Arrays.asList(a1, b1, c1);
        //装成list
        List agelist = list2.stream().map(streamdemo1::getAge).collect(Collectors.toList());
        System.out.println("ageList:"+agelist);
        agelist.forEach(System.out::println);
        //转成set
        Set ageSet = list2.stream().map(streamdemo1::getAge).collect(Collectors.toSet());
        System.out.println("ageSet:"+ageSet);
        //转成map:key不能相同,否则报错
        Map tomap = list2.stream().collect(Collectors.toMap(streamdemo1::getName, streamdemo1::getAge));
        System.out.println("tomap:"+tomap);
        //字符串分隔符连接
        String collect = list2.stream().map(streamdemo1::getName).collect(Collectors.joining(",", "(", ")"));
        System.out.println("collect:"+collect);

        //聚合操作
        //1,学生总数
        Long count1 = list2.stream().collect(Collectors.counting());
        //2,年纪最大,(最小年龄minby)
        Integer maxage = list2.stream().map(streamdemo1::getAge).collect(Collectors.maxBy(Integer::compare)).get();
        //3.所有人的年纪
        Integer sumage = list2.stream().collect(Collectors.summingInt(streamdemo1::getAge));
        //4.平均年龄
        Double aveAge = list2.stream().collect(Collectors.averagingDouble(streamdemo1::getAge));
        //带上以上所有的方法
        DoubleSummaryStatistics sumAll = list2.stream().collect(Collectors.summarizingDouble(streamdemo1::getAge));
        System.out.println("count1:"+sumAll.getCount()+",max:"+sumAll.getMax()+",sum:"+sumAll.getSum()+",min:"
        +sumAll.getMin()+",ave:"+sumAll.getAverage());

        //分区
        //分成两部分:一部分是大于等于11,一部分小于11
        Map> parmap = list2.stream().collect(Collectors.partitioningBy(v -> v.getAge() >= 11));
        System.out.println("parmap:"+parmap);

        //规约
        Integer allage = list2.stream().map(streamdemo1::getAge).collect(Collectors.reducing(Integer::sum)).get();
        System.out.printf("allage:", allage);
        System.out.println("allage = " + allage);
    }
}

Grouping by

​ 一个或多个属性对集合中的项目进行分组

stream

1.是什么

stream是java8中处理集合的关键抽象概念,对集合进行操作

使用声明式编程来处理集合的java接口,可以看作遍历数据集的高级迭代器。

  • 集合是内存中的数据结构,所有的值都是已经计算好的;
  • 流是一个概念上的数据结构,它的元素都是在使用到的时候才计算出来的。
  • 集合是关于数据的,流是关于计算的;
  • 集合是外部迭代,(外部迭代就是每次操作都要迭代一次);流是内部迭代,所有操作只需要一次操作。
  • 集合可以多次使用,就像DVD;流只能使用一次,就像直播

2.为什么使用它

使用stream api 对集合进行操作,就像使用 sql 对数据库进行查询。stream api 提供了一种高效且易于使用的处理数据的方式

3.怎么使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tk1fB1lP-1653960313239)(C:Userspengzhang1Desktop学习2stream.jpg)]

分类

stream 操作分类

  • 中间操作

    • 无状态
    unordered(),filter(),map(),mapToInt(),mapToLong(),mapToDouble(),flatMap(),flatMapToInt(),flatMapToLong(),flatMapToDouble(),peek()
    
    • 有状态
    distinct(),sorted(),limit(),skip()
    
  • 约束操作

    • 非短路操作
    forEach(),forEachOrdered(),toArray(),reduce(),collect(),max(),min(),count()
    
    • 短路操作
    anyMatch(),allMatch(),noneMatch(),findFirst(),findAny()
    

    无状态:指元素的处理不受之前元素的影响

    有状态:指该操作只有拿到所有元素之后才能继续下去

    非短路操作:指必须处理所有元素才能得到最终结果

    短路操作:指遇到某些符合条件的元素就可以的得到最终的结果

具体使用 流的创建
package com.zp.demo1;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Stream;


public class streamdemo1 {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public streamdemo1(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public streamdemo1() {
    }

    @Override
    public String toString() {
        return "streamdemo1{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }

    public static void main(String [] args) throws FileNotFoundException {


        //1.使用collection 下的stream()和parallelStream()方法
        ArrayList list = new ArrayList<>();
        Stream stream = list.stream();//获取一个顺序流
        Stream parallelStream = list.parallelStream();//获取一个并行流

        //2.使用Arrays中的stream()方法,将数组转换成流
        Integer[] integers = new Integer[10];
        Stream stream1 = Arrays.stream(integers);

        //3.使用stream中的静态方法,of(),iterator(),generate()
        Stream integerStream = Stream.of(1, 2, 3, 4, 5);//of()方法

        Stream stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
        stream2.forEach(System.out::println);//iterate()方法

        Stream stream3 = Stream.generate(Math::random).limit(3);
        stream3.forEach(System.out::println);//generate()方法

        //4.BufferedReader.lines()方法,将每行内容转化成流
        BufferedReader bufferedReader = new BufferedReader(new FileReader("E:\test.txt"));
        Stream linesStream = bufferedReader.lines();
        linesStream.forEach(System.out::println);

        //5.Pattern.splitAsStream()方法,将字符串分隔成流
        Pattern patter = Pattern.compile(",");
        Stream stringStream = patter.splitAsStream("a,b,c,d");
        stringStream.forEach(System.out::println);

    }
}

中间操作
package com.zp.demo1;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;


public class streamdemo2 {
    public static void main(String[] args){

        
        Stream integerStream = Stream.of(1, 1, 2, 2, 3, 3, 4, 5, 6, 7);
        Stream integerStream1 = integerStream.filter(s -> s > 1)//把小于1的过滤了
                .distinct()//去重
                .skip(3)//从2开始跳过3个
                .limit(2);//只显示两个
        integerStream1.forEach(System.out::println);


        

        List strings = Arrays.asList("a,b,c", "1,2,3");

        //map
        //将每一个元素转换成一个新的且不带逗号的元素
        Stream stringStream = strings.stream().map(s -> s.replaceAll(",", ""));
        stringStream.forEach(System.out::println);

        //flatMap
        Stream stream3 = strings.stream().flatMap(s -> {
            //将每一个元素转换成一个stream
            String[] split = s.split(",");
            Stream stream = Arrays.stream(split);
            return stream;
        });
        stream3.forEach(System.out::println);


        

        List strings1 = Arrays.asList("aa", "bb", "ff", "cc");
        strings1.stream().sorted().forEach(System.out::println);

        streamdemo1 s1 = new streamdemo1("aa",10);
        streamdemo1 s2 = new streamdemo1("cc",11);
        streamdemo1 s3 = new streamdemo1("bb",13);
        streamdemo1 s4 = new streamdemo1("aa",12);
        streamdemo1 s5 = new streamdemo1("ee",14);
        List streamdemo1s = Arrays.asList(s1, s2, s3, s4, s5);

        //自定义排序,先按姓名升序,姓名相同后按年龄
        streamdemo1s.stream().sorted(
                (o1,o2)->{
                    if (o1.getName().equals(o2.getName())){
                        return o1.getAge() - o2.getAge();
                    }else{
                        return o1.getName().compareTo(o2.getName());
                    }
                }
        ).forEach(System.out::println);

        

        streamdemo1 streamdemo1 = new streamdemo1("aa",12);
        streamdemo1 streamdemo2 = new streamdemo1("aa",11);
        List streamdemo1s1 = Arrays.asList(streamdemo1, streamdemo2);

        streamdemo1s1.stream().peek(o->o.setAge(100)).forEach(System.out::println);

        
        List arrayList =Arrays.asList(1, 2, null, 3,2, null, 3, 4, 5, 6, 7,8);
        System.out.println("sum is:"+arrayList.stream().filter(num -> num != null)
            .distinct().mapToInt(num -> num * 2)
                .peek(System.out::println).skip(2).limit(6).sum()
        );


    }

}

终端操作
package com.zp.demo1;

import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Collectors;

public class streamdemo3 {
    public static void main(String [] args){

        
        List integers = Arrays.asList(1, 2, 3, 4, 5);
        boolean allMatch = integers.stream().allMatch(e -> e > 10);
        boolean noneMatch = integers.stream().noneMatch(e -> e > 6);
        boolean anyMatch = integers.stream().anyMatch(e -> e > 4);
        System.out.println("allMatch:"+allMatch);
        System.out.println("noneMatch:"+noneMatch);
        System.out.println("allMatch:"+anyMatch);

        Integer findFirst = integers.stream().findFirst().get();
        Integer findAny = integers.stream().findAny().get();
        System.out.println("findFirst:"+findFirst);
        System.out.println("findAny:"+findAny);

        long count = integers.stream().count();
        Integer max = integers.stream().max(Integer::compareTo).get();
        Integer min = integers.stream().min(Integer::compareTo).get();
        System.out.println("count:"+count);
        System.out.println("max:"+max);
        System.out.println("min:"+min);

        
        List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24);
        Integer reduce1 = list.stream().reduce((x1, x2) -> x1 + x2).get();
        System.out.println("reduce1:"+reduce1);
        Integer reduce2 = list.stream().reduce(10, (x1, x2) -> x1 + x2);
        System.out.println("reduce2:"+reduce2);
        Integer reduce3 = list.stream().reduce(0,
                (x1, x2) -> {
                    System.out.println("stream accumulator:x1:" + x1 + " x2:" + x2);
                    return x1 - x2;
                },
                (x1, x2) -> {
                    System.out.println("stream combiner: x1:" + x1 + "  x2:" + x2);
                    return x1 * x2;
                });
        System.out.println("reduce3:"+reduce3);
        Integer reduce4 = list.parallelStream().reduce(0,
                (x1, x2) -> {
                    System.out.println("parallelStream  accumulator: x1:" + x1 + "   x2:" + x2);
                    return x1 - x2;
                },
                (x1, x2) -> {
                    System.out.println("parallelStream combiner: x1:" + x1 + "  x2:" + x2);
                    return x1 * x2;
                });
        System.out.println("reduce4:"+reduce4);

        
        streamdemo1 a1 = new streamdemo1("aaa", 10);
        streamdemo1 b1 = new streamdemo1("bbb", 11);
        streamdemo1 c1 = new streamdemo1("ccc", 12);
        List list2 = Arrays.asList(a1, b1, c1);
        //装成list
        List agelist = list2.stream().map(streamdemo1::getAge).collect(Collectors.toList());
        System.out.println("ageList:"+agelist);
        agelist.forEach(System.out::println);
        //转成set
        Set ageSet = list2.stream().map(streamdemo1::getAge).collect(Collectors.toSet());
        System.out.println("ageSet:"+ageSet);
        //转成map:key不能相同,否则报错
        Map tomap = list2.stream().collect(Collectors.toMap(streamdemo1::getName, streamdemo1::getAge));
        System.out.println("tomap:"+tomap);
        //字符串分隔符连接
        String collect = list2.stream().map(streamdemo1::getName).collect(Collectors.joining(",", "(", ")"));
        System.out.println("collect:"+collect);

        //聚合操作
        //1,学生总数
        Long count1 = list2.stream().collect(Collectors.counting());
        //2,年纪最大,(最小年龄minby)
        Integer maxage = list2.stream().map(streamdemo1::getAge).collect(Collectors.maxBy(Integer::compare)).get();
        //3.所有人的年纪
        Integer sumage = list2.stream().collect(Collectors.summingInt(streamdemo1::getAge));
        //4.平均年龄
        Double aveAge = list2.stream().collect(Collectors.averagingDouble(streamdemo1::getAge));
        //带上以上所有的方法
        DoubleSummaryStatistics sumAll = list2.stream().collect(Collectors.summarizingDouble(streamdemo1::getAge));
        System.out.println("count1:"+sumAll.getCount()+",max:"+sumAll.getMax()+",sum:"+sumAll.getSum()+",min:"
        +sumAll.getMin()+",ave:"+sumAll.getAverage());

        //分区
        //分成两部分:一部分是大于等于11,一部分小于11
        Map> parmap = list2.stream().collect(Collectors.partitioningBy(v -> v.getAge() >= 11));
        System.out.println("parmap:"+parmap);

        //规约
        Integer allage = list2.stream().map(streamdemo1::getAge).collect(Collectors.reducing(Integer::sum)).get();
        System.out.printf("allage:", allage);
        System.out.println("allage = " + allage);
    }
}

Grouping by

​ 一个或多个属性对集合中的项目进行分组

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/939405.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号