1、java中获取流的两种方式

  1. java8中的“流”实际上是Stream接口的对象
  2. JDK中提供了一个流接口,java.util.stream.Stream,java.util.stream.Stream 是Java 8新加入的最常用的流接口。(这并不是一个函数式接口。)

获取一个流非常简单,有以下几种常用的方式:

  • 所有的 Collection 集合都可以通过 stream 默认方法获取流;
    集合对象名.stream();
  • Stream 接口的静态方法 of 可以获取数组对应的流。
    Stream.of(数组名称);
package Stream;

/*
* java8中的“流”实际上是Stream接口的对象
* JDK中提供了一个流接口,java.util.stream.Stream
*
* 如何获取流:
*      (1)根据集合获取流 , 集合对象名.stream();
*      (2)根据数组获取流 ,Stream.of(数组名称);
*
* */

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

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

        //根据集合获取流
        ArrayList<String> list=new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        Stream<String> stream1 = list.stream();

        //2、根据数组获取流,数组中的元素必须是引用类型的才可以
        String[] StringArrays=new String[]{"Hello","world"};
        Stream<String> stream2= Stream.of(StringArrays);

        //如果不是引用类型,使用包装类
        Integer[] IntegerArrays=new Integer[]{10,20,30};
        Stream<Integer> stream3=Stream.of(IntegerArrays);

    }
}

2、Stream中的map映射

例:1、普通情况:将集合中无特殊字符串转整形

package Stream;

/*
* 获取流之后,可以使用映射方法:map(用于转的lambda表达式)
*
* 映射:就是将一个对象映射到另一个对象上,将老对象映射到新对象
*
* */

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

public class Demo02StreamMap01 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        //list集合当中存放的是字符串
        list.add("100");
        list.add("200");
        list.add("300");

        //用循环实现字符类型的转换
        for (int i = 0; i <list.size() ; i++) {
            int value = Integer.parseInt(list.get(i));
            System.out.println("集合中的第"+(i+1)+"个元素的值为:"+value);
        }

        System.out.println("=====================================");

        //用Stream流式思想转换集合当中的数据类型
        Stream<Integer> stream= list.stream().map((String str)->{
            int value=Integer.parseInt(str);
            return  value;
        });

        //尝试输出集合中的数据
        Object[] objects = stream.toArray();
        System.out.println("流中的元素输出:"+Arrays.toString(objects));

        //Lambda表达式的写法1:
        //只有一个参数,参数的返回值类型可以去掉
        Stream<Integer> stream1=list.stream().map(str->{
           int value=Integer.parseInt(str);
           return value;
        });

        //Lambda表达式的写法2:
        Stream<Integer> stream2=list.stream().map(str->{
           return Integer.parseInt(str);
        });

        ///Lambda表达式的写法3:
        Stream<Integer> stream3=list.stream().map(Integer::parseInt);


    }
}

java stream流按月份分组_数组


2、集合中有特殊字符,利用split方法

package Stream;
/*
* 功能分析:
*       带有分隔符的集合元素转换成流式操作
*
* */

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

public class Demo02StreamMap02 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("张三,18");
        list.add("李四,20");
        list.add("王五,34");

        //用for循环方式实现转换
        ArrayList<String> list1=new ArrayList<>();
        for (int i = 0; i <list.size() ; i++) {
            String[] split = list.get(i).split(",");
           String result=split[1];
           list1.add(result);
        }
        System.out.println("集合list1的值:");
        for (int i = 0; i <list1.size() ; i++) {
            System.out.println("list["+i+"]"+"="+list1.get(i));
        }

        //Lambad表达式简洁写法1
       Stream<String> stream=list.stream().map((String str)->{
           String[] split = str.split(",");
           String result=split[1];
           return result;
       });

        //Lambad表达式简洁写法2
        Stream<String> stream1=list.stream().map(s->{
            String[] split = s.split(",");
            return split[1];
        });

        //Lambad表达式简洁写法3
        Stream<String> stream2=list.stream().map(s->{
            return s.split(",")[1];
        });

        //Lambad表达式简洁写法4
        Stream<String> stream3=list.stream().map(s->s.split(",")[1]);

    }
}

java stream流按月份分组_java_02

3、Stream中的Filter

package Stream;

/*
* 如果希望对流中的数据进行过滤,可以使用:
* Filter(能产生Boolean类型的Lambda结果的表达式);如果结果为true,就要,如果结果为false,就不要
*
* */
import java.util.ArrayList;
import java.util.stream.Stream;

public class Demo03StreamFilter {
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<>();
        list.add(92);
        list.add(85);
        list.add(70);

        Stream<Integer> stream = list.stream().filter((Integer num)->{
           boolean b=num>80;
           return b;
        });

        Stream<Integer> stream1 = list.stream().filter( num->{
            boolean b=num>80;
            return b;
        });

        Stream<Integer> stream2 = list.stream().filter( num->{
            return  num>80;
        });

        //花括号中只有一个表达式,return和花括号可以去掉
        Stream<Integer> stream3 = list.stream().filter(num->num>80);

        System.out.println("===================================");

        ArrayList<String> list1=new ArrayList<>();
        list1.add("张三");
        list1.add("李四");
        list1.add("王五");

        //用Lambda过滤,只要姓名为张三的
        Stream<String> streamA=list1.stream().filter((String str)->{
           boolean b=str.equals("张三");
           return b;
        });

        Stream<String> streamB=list1.stream().filter(s->{
            return s.equals("张三");
        });

        Stream<String> streamC=list1.stream().filter(s->s.equals("张三"));
        
    }
}

4、Stream流的ForEach(遍历)操作

package Stream;

/*
* 如果希望在流中对数据进行遍历操作,可使用forEach:
* forEach(Lambda表达式),对流中的每一个表达式进行操作
*
* 参数Lambda表达式必须是一个可以消费一个参数,并且不产生一个数据结果的Lambda
*
* 例如:
*Lambda:       s->System.out.println(s)
* 方法引用:     System::println;
* */

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

public class Demo04StreamForEach {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");

        //写法1
        Stream<String> stream1=list.stream();
        stream1.forEach((String str)->{
            System.out.println(str);
        });

        //写法2
        list.stream().forEach(str->{
            System.out.println(str);
        });

        //写法3
        list.stream().forEach(System.out::println);
    }
}

5、并发的Stream流

一个进程进行操作:

package Stream;

/*
* 流中的元素特别多,让一个人挨个处理,肯定特别慢
* 让多个人同时去处理,效率提高,这就是“并发”
*
* 如何才能获取“并发流”(支持并发操作的流)
* .paralleStream()
*
* 注意事项:
*   1、使用并发流进行操作时,到底有几个人在同时进行操作,不用管,直接用即可
*   2、在使用时,绝对不会出现两个人抢到同一个元素
*
* 如果以及获取到一个普通的流,调用paralle方法,也可以变成并发流
*
* */

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

public class Demo05StreamBingfa {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        for (int i = 0; i <10 ; i++) {
            list.add("Hello----"+i);
        }

        //一个流进行操作
        Stream<String> streamA=list.stream();
       streamA.forEach((String str)->{
           System.out.println(str);
       });

      /*  //使用并发流进行操作
        Stream<String> streamB = list.parallelStream();
        streamB.forEach((String str)->{
            System.out.println(str);
        });

        //如果以及获取到一个普通的流,调用paralle方法,也可以变成并发流
        list.stream().forEach(System.out::println);
*/
    }
}

一个人进行操作,按顺序输出。

java stream流按月份分组_java_03


多个进程进行操作时:

package Stream;

/*
* 流中的元素特别多,让一个人挨个处理,肯定特别慢
* 让多个人同时去处理,效率提高,这就是“并发”
*
* 如何才能获取“并发流”(支持并发操作的流)
* .paralleStream()
*
* 注意事项:
*   1、使用并发流进行操作时,到底有几个人在同时进行操作,不用管,直接用即可
*   2、在使用时,绝对不会出现两个人抢到同一个元素
*
* 如果以及获取到一个普通的流,调用paralle方法,也可以变成并发流
*
* */

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

public class Demo05StreamBingfa {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        for (int i = 0; i <10 ; i++) {
            list.add("Hello----"+i);
        }
/*
        //一个流进行操作
        Stream<String> streamA=list.stream();
       streamA.forEach((String str)->{
           System.out.println(str);
       });*/

        //使用并发流进行操作
        Stream<String> streamB = list.parallelStream();
        streamB.forEach((String str)->{
            System.out.println(str);
        });

       /* //如果以及获取到一个普通的流,调用paralle方法,也可以变成并发流
        list.stream().forEach(System.out::println);*/
    }
}

并发流执后的结果是无序的。

java stream流按月份分组_数组_04