> 文章列表 > Java基础——Stream流

Java基础——Stream流

Java基础——Stream流

(1)Stream流概述:

1.什么是Stream流?

  • 用于简化集合和数组操作的API。结合了Lambda表达式。
  • 方便操作集合/数组的手段(集合/数组才是开发的目的)。

 2.体验Stream流的作用:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/* 体验stream流作用*/
public class StreamDemo01 {public static void main(String[] args) {//需求:找到名字是小开头的,且长度为3的元素List<String> names = new ArrayList<>();Collections.addAll(names,"小小","小心心","小星星","大大");System.out.println(names);//1.遍历查找://1.1从集合中找出小开头的元素放到新集合List<String> xiaoList = new ArrayList<>();for (String name : names) {if (name.startsWith("小")){xiaoList.add(name);}}//1.2从小开头的名字集合中找到长度为3的元素放到新集合List<String> xiaoThreeList = new ArrayList<>();for (String s : xiaoList) {if (s.length() == 3){xiaoThreeList.add(s);}}System.out.println(xiaoThreeList);//2.使用stream流方法     filter:进行过滤     forEach:对每个元素进行输出names.stream().filter(s -> s.startsWith("小")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));}
}

3.Stream流思想:

  • 先得到集合或者数组的Stream流。(就像一根传送带,一次次进行筛选过滤,再输出)
  • 把元素放上去。
  • 然后就用这个Stream流简化的API来方便的操作元素。 

(2)Stream流的获取:

Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。

1.Stream流的三类方法:

  • 获取Stream流:
    • 创建一条流水线,并把数据放到流水线上准备进行操作。
  • 中间方法:
    • 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
  • 终结方法:
    • 一个Stream流只能有一个终极方法,是流水线上的最后一个操作。

2.集合获取Stream流的方式:

  • 可使用Collection接口中的默认方法stream()生成流
名称 说明
default Stream<E> stream() 获取当前集合对象的Stream流

3.数组获取Stream流的方式:

名称 说明
public static <T> Stream<T> stream(T[] array) 获取当前数组的Stream流
public static<T> Stream<T> of(T... values) 获取当前数组/可变数据的Stream流
import java.util.*;
import java.util.stream.Stream;/* 获取Stream流*/
public class StreamDemo02 {public static void main(String[] args) {//1.集合获取Stream流//1.1Collection集合获取流Collection<String> list = new ArrayList<>();Stream<String> s = list.stream();//1.2Map集合获取流Map<String,Integer> maps = new HashMap<>();//对键获取流Stream<String> keyStream = maps.keySet().stream();//对值获取流Stream<Integer> valueStream = maps.values().stream();//键值对流 entrySet()==>将Map转SetStream<Map.Entry<String,Integer>> kvStream = maps.entrySet().stream();//2.数组获取流String[] names = {"大大","小小","青青","晨晨"};Stream<String> arrStream = Arrays.stream(names);//方式1Stream<String> arrStream01 = Stream.of(names);//方式2}
}

4.Stream流常用的API(中间操作方法)

  • 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
  • 在Stream流中无法直接修改集合,数组中的数据。
名称 说明
Stream<T> filter(Predicate<? super T> predicate) 用于对流中的数据进行过滤
Stream<T> limit(long maxSize) 获取前几个元素
Stream<T> skip(long n) 跳过前几个元素
Stream<T> distinct() 去除流中重复的元素,依赖(hashCode和equals方法)
static <T> Stream<T> concat(Stream a,Stream b) 合并a和b两个流为一个流
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;/* Stream流常用的API*/
public class StreamDemo03 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("大大");list.add("小小");list.add("小青青");list.add("小晨晨");//找出集合元素以小开头的元素//1. 用于对流中的数据进行过滤 Stream<T> filter(Predicate<? super T> predicate)
//        list.stream().filter(new Predicate<String>() {
//            @Override
//            public boolean test(String s) {
//                return s.startsWith("小");
//            }
//        });//简化1
//
//        list.stream().filter( s -> s.startsWith("小")).forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });//简化2list.stream().filter( s -> s.startsWith("小")).forEach( s -> System.out.println(s));//统计集合元素长度等于3的个数long size = list.stream().filter(s -> s.length() == 3).count();System.out.println(size);//2.获取前几个元素 Stream<T> limit(long maxSize)//list.stream().filter(s -> s.startsWith("小")).limit(2).forEach(s -> System.out.println(s));//简化list.stream().filter(s -> s.startsWith("小")).limit(2).forEach(System.out::println);//3.跳过前几个元素  Stream<T> skip(long n)list.stream().filter(s -> s.startsWith("小")).skip(2).forEach(System.out::println);//4.map加工方法:第一个参数是原材料,第二个参数是加工后的结果//给集合元素前面加一个,我的list.stream().map(s -> "我的" + s).forEach(System.out::println);//5.合并a和b两个流为一个流    static <T> Stream<T> concat(Stream a,Stream b)Stream<String> s1 = list.stream().filter(s -> s.startsWith("小"));Stream<Integer> s2 = Stream.of(1,2);Stream<Object> s3 = Stream.concat(s1,s2);s3.forEach(System.out::println);}
}

5.Stream流的常见终极操作方法:

  • 终极操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了
名称 说明
void forEach(Consumer action) 对此流的每个元素执行遍历操作
long count() 返回此流中的元素数

(3)Stream流的收集: 

1.收集Stream流的含义:

  • 收集Stream流的含义就是把Stream流操作后的结果数据转回到集合或者数组中去。

2.Stream流的收集方法:

名称 说明
R collect(Collector collector) 开始收集Stream流,指定收集器

Collectors工具类提供了具体的收集方式:

名称 说明
public static <T> Collector toList() 把元素收集到List集合中
public static <T> Collector toSet() 把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

===================================================