文章目录

  • 流的性质
  • 创建流
  • 中间操作
  • 终止操作
  • Collectors
  • 单列集合收集器
  • 双列集合收集器
  • 字符串收集器


流的性质

流遵循了做什么而非怎么做的原则,它有以下性质:

  • 流不存储元素,这些元素可能存储在底层集合中或者是按需生成的
  • 流的操作不会改变数据源,而是会生成一个新的流,其中不包含被过滤掉的元素
  • 流的操作是尽可能惰性执行的

使用流一般需要三个操作步骤:创建流、中间操作和终止操作。

java中流式布局的特点 java流式编程常用方法_java

创建流

Stream中的静态方法

static <T> Stream<T> of(T... values)//返回包含values元素的流
static <T> Stream<T> empty()//返回一个空流
static <T> Stream<T> generate(Supplier<T> s)//返回一个由s提供元素的无限流
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)//返回一个由f提供元素的无限流,f的起始参数为seed,之后的参数为该方法的返回值

集合类的stream方法

List<Integer>list=new ArrayList<>();
Collections.addAll(list,new Integer[]{1,2,3,4,5});
Stream<Integer> stream = list.stream();

Arrays.stream()

static <T> Stream<T> stream(T[] array) 
static <T> Stream<T> stream(T[] array, int from, int to)

Files.lines()

static Stream<String> lines(Path path)   
static Stream<String> lines(Path path, Charset cs)

并行流

Stream<T> parallel()

中间操作

Stream<T> limit(long maxSize)//限制流的长度
Stream<T> skip(long n)//跳过流中的前n个元素
Stream<T> distinct()//清除流中的重复元素
Stream<T> sorted()//对流中的元素进行排序
Stream<T> sorted(Comparator<? super T> comparator)//对流中的元素进行排序
Stream<T> filter(Predicate<? super T> predicate)//保留predicate返回true的元素
<R> Stream<R> map(Function<? super T,? extends R> mapper)//对每个元素都执行mapper
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)//展平流并对每个流元素执行mapper操作
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)//连接两个流,其元素是第一个流的所有元素,后跟第二个流的所有元素。

终止操作

long count()//返回此流中的元素数
Iterator<T> iterator()//返回用于遍历流中元素的迭代器
Optional<T> max(Comparator<? super T> comparator)//返回流中最大或最小的元素
Optional<T> min(Comparator<? super T> comparator)
<A> A[] toArray(IntFunction<A[]> generator)//返回一个包含此流元素的数组
void forEach(Consumer<? super T> action)//对流中的每个元素进行操作
boolean allMatch(Predicate<? super T> predicate)//如果每个流元素提供给 predicate都返回true则结果为true,在遇见第一个false时停止运算
boolean anyMatch(Predicate<? super T> predicate)//如果任意一个流元素提供给 predicate返回true则结果为true,在遇见第一个true时停止运算 
boolean noneMatch(Predicate<? super T> predicate)//如果每个流元素提供给 predicate都返回false则结果为true,在遇见第一个true时停止运算
<R,A> R collect(Collector<? super T,A,R> collector)使用 collector收集流元素到集合中
Optional<T> reduce(BinaryOperator<T> accumulator)//使用accumulator来整合流中的元素,如果流为空则为identity值
T reduce(T identity, BinaryOperator<T> accumulator)

Collectors

Collectors提供了大量用于生成常见Collector的工厂方法

单列集合收集器

//返回一个 Collector ,将流元素收集到任意集合中,可传入一个集合的构造器。
static <T,C extends Collection< T >> Collector<T,?,C> toCollection(Supplier< C> collectionFactory)

双列集合收集器

//返回一个 Collector ,它将元素累加到一个 Map ,其键和值是将所提供的映射函数应用于输入元素的结果。 对于每个toMap方法都有一个可以产生并发映射表的toConcurrentMap方法对应
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)   
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator< U > mergeFunction)  
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator< U > mergeFunction, Supplier< M > mapSupplier)

字符串收集器

//返回一个 Collector ,将流元素(前提所有流元素全是字符串)拼接到一个字符串中,可以为每个元素设置分隔符,前缀和后缀
static Collector<CharSequence,?,String> joining()   
static Collector<CharSequence,?,String> joining(CharSequence delimiter) 
static Collector<CharSequence,?,String> joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)