1、java strem 流

目录

1、java strem 流

2、一些方法的使用


  流,是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算。

        (1)对于开发人员来说,使用处理流进行输入、输出操作更简单;

        (2)使用处理流执行效率更高。

2、一些方法的使用

package com.xhstudy.xh.java.stream;

import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

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

/**
 * @ClassName StreamJava
 * @Description java 流操作 一些方法使用
 *      (1)对于开发人员来说,使用处理流进行输入、输出操作更简单;(2)使用处理流执行效率更高。
 * @Author wy
 * @Version 1. 0
 **/
public class StreamJava {
    /*
    * 流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。
    * 流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算
    * */
    public static void main(String[] args) throws IOException {

        //列表生成
        List<Integer> integerList= Arrays.asList(1,1,2,3,4,5,6);
        Stream<Integer> integerStream=integerList.stream();

        //数组生成
        /*
         * Stream API提供了mapToInt、mapToDouble、mapToLong三种方式将对象流【即Stream 】转换成对应的数值流
         * 同时提供了boxed方法将数值流转换为对象流.
         * */
        int[] ints={1,2,3,4,5,6};
        IntStream intStream=Arrays.stream(ints);//使用Arrays.stream生成的是数值流并非stream,避免拆箱装箱,提高性能

        //值生成
        Stream<Integer> integerStream1=Stream.of(1,2,3,4,5,6);
        //文件生成
//        Stream<String> lines= Files.lines(Paths.get("/file"), Charset.defaultCharset());
        //函数生成
        Stream<Integer> integerStream2=Stream.iterate(0,n->n+12).limit(5);
        Stream<Double> doubleStream=Stream.generate(Math::random).limit(5);

        /*
        * 流的操作分为两种
        * 1、中间操作
        *   一个流可以后面跟随零个或多个中间操作。
        *   其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。
        *   这类操作都是惰性化的,仅仅调用到这类方法,并没有真正开始流的遍历,真正的遍历需等到终端操作时
        *   常见的中间操有filter、map 等
        * 2、终端操作
        *   一个流有且只能有一个终端操作,当这个操作执行后,流就被关闭了,无法再被操作
        *   因此一个流只能被遍历一次,若想再遍历需要通过源数据在生成流。
        *   终端操作的执行,才会真正开始流的遍历。 count、collect 等。
        * */

        //中间操作
        integerStream=integerStream.filter(i->i<5);//筛选i>5的值
        integerStream=integerStream.distinct();//去重
        integerStream=integerStream.limit(3);//限制返回流个数
        integerStream=integerStream.skip(2);//跳过流中前两个
            //map 流映射
            //所谓流映射就是将接受的元素映射成另外一个元素。
        List<String> seventhNight= Arrays.asList("I","love","you ~");
        List<Integer> seventhNightLength=seventhNight.stream()
                .map(String::length)
                .collect(Collectors.toList());
            //flatMap 流转换
            //将一个流中的每个值都转换为另一个流
        List<String > seventhNightNotE=seventhNight.stream()
                .map(m->m.split(" "))
                .flatMap(Arrays::stream)
                .collect(Collectors.toList());

        if (integerList.stream().allMatch(i->i>7)){ //allMatch 匹配所有元素
            System.out.println("所有元素都大于7");
        }
        if(integerList.stream().anyMatch(i->i>3)){//anyMatch匹配其中一个
            System.out.println("存在元素大于3");
        }
        if (integerList.stream().noneMatch(i->i>3)) {//不存在大于3的元素,即都小雨3
            System.out.println("所有元素小于3");
        }

        //终端操作
        integerList.stream().count();//流中元素总数

        Optional<Integer> integerOptional= integerList.stream().findFirst();//查找第一个
        Optional<Integer> integerOptional1 = integerList.stream().findAny();//随便查找一个
        System.out.println(integerOptional.orElse(-1));

        int sum=integerList.stream().reduce(0,Integer::sum);//求和

        Optional<Integer> min = integerList.stream()//获取最小值
                .min(Integer::compareTo);
        Optional<Integer> max = integerList.stream()//获取最大值
                .max(Integer::compareTo);

        Optional<Integer> min1 = integerList.stream().reduce(Integer::min);
        Optional<Integer> max1 = integerList.stream().max(Integer::max);
        double average = seventhNight.stream()
                .collect(averagingInt(String::length));//平均值

        integerList.stream().forEach(System.out::println);//输出

        List<Integer> intList = seventhNight.stream()
                .map(String::length)
                .collect(Collectors.toList());//转list

        //joining 拼接流中的元素
        String result=seventhNight.stream().collect(Collectors.joining("-"));
        System.out.println(result);
        //分组
        Map<Integer, List<String>> collect = seventhNight.stream()
                                .collect(groupingBy(String::length));//长度分组

        Map<Integer, Map<String, List<String>>> c = seventhNight.stream()//分组2
                .collect(groupingBy(
                        String::length,
                        groupingBy(item -> {
                            if (item.length() <= 2) {
                                return "level1";
                            } else if (item.length() <= 6) {
                                return "level2";
                            } else {
                                return "level3";
                            }
                        })
                ));

        //分区
        Map<Boolean, List<String>> collect1 = seventhNight.stream()
                .collect(partitioningBy(String::isEmpty));//按照是否为null分区

    }
}