Java Stream流中的实用操作,各种流操作的参考示例分析

极路由 极1s J1S hc5661 刷padavan固件 极路由1S刷机指南 准备工作: 下载Breed不死固件 通过WinSCP上传或直接wget获取 执行mtd命令写入Breed 关键步骤: 进入Breed控制台(按住Reset键开机) 备份原厂固件和密钥 下载Padavan固件(RT-N14U-GPIO-12-xiaodu-ji1S-128M.trx) 刷机过程: 在Breed控制台更新固件 等待自动重启完成 初始设置: 管理地址:192.168.123.1 默认账号:admin/admin 无线名称:PCDN 无线密码:1234567890 注意事项:切勿 阅读详情

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

downstream.accumulator(),

downstream.combiner(),

downstream.finisher().andThen(finisher),

characteristics);

}

counting

========

/**

  • 返回Collector中指定类型元素的数量

  • @return Collector<T, ?, Long> 指定输入元素数量的收集器

*/

public static Collector<T, ?, Long> counting() {

return summingLong(e -> 1L);

}

groupingBy

==========

/**

  • 返回一个对输入的指定类型的元素执行分组操作的Collector

    • 根据分组函数进行分组操作
    • 并将结果以Map类型返回
  • @param classifier 指定的分组函数

  • @return Collector<T, ?, Map<K, List>> Map类型的返回结果

*/

public static <T, K> Collector<T, ?, Map<K, List>> groupingBy(Function<? super T, ? extends K> classifier) {

return groupingBy(classifier, toList());

}

/**

  • 返回一个对输入的指定类型的元素执行级联分组操作的Collector

    • 根据分组函数进行分组操作
    • 然后根据下游收集器对关联key的value值执行指定的规约操作
  • @param classifier 指定的分组函数

  • @param downstream 指定执行规约操作的下游收集器

  • @return Collector<T, ?, Map<K, D>> 实现了级联分组操作的结果

*/

public static <T, K, A, D> Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream) {

return groupingBy(classifier, HashMap::new, downstream);

}

/**

  • 返回一个对输入的指定类型的元素执行级联分组操作的,并以指定的Map实现方式保存结果返回的Collector

    • 根据分组函数进行分组操作
    • 再根据下游收集器对关联key的value值执行指定的规约操作
    • 然后将结果保存到指定方式实现的Map中
  • @param classifier 指定的分组函数

  • @param mapFactory 指定的Map实现

  • @param downstream 指定执行规约操作的下游收集器

  • @return Collector<T, ?, M> 实现了级联分组操作的Collector结果

*/

public static <T, K, D, A, M extends Map<K, D>> Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier, Supplier mapFactory, Collector<? super T, A, D> downstream) {

Supplier downstreamSupplier = downstream.supplier();

BiConsumer<A, ? super T> downstreamAccumulator = downstream.accumulator();

BiConsumer<Map<K, A>, T> accumulator = (m, t) -> {

K key = Objects.requireNonNull(classifier.apply(t), “element cannot be mapped to a null key”);

A container = m.computeIfAbsent(key, k -> downstreamSupplier.get());

downstreamAccumulator.accept(container, t);

};

BinaryOperator<Map<K, A>> merger = Collectors.<K, A, Map<K, A>>mapMerger(downstream.combiner());

@SuppressWarnings(“unchecked”)

Supplier<Map<K, A>> mangledFactory = (Supplier<Map<K, A>>) mapFactory;

if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) {

return new CollectorImpl<>(mangledFactory, accumulator, merger, CH_ID);

}

else {

@SuppressWarnings(“unchecked”)

Function<A, A> downstreamFinisher = (Function<A, A>) downstream.finisher();

Function<Map<K, A>, M> finisher = intermediate -> {

intermediate.replaceAll((k, v) -> downstreamFinisher.apply(v));

@SuppressWarnings(“unchecked”)

M castResult = (M) intermediate;

return castResult;

};

return new CollectorImpl<>(mangledFactory, accumulator, merger, finisher, CH_NOID);

}

}

groupingByConcurrent

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

/**

  • 返回一个对输入的指定类型的元素执行分组操作的并行Collector

    • 根据分组函数进行分组操作
    • 并将结果以Map类型返回
  • @param classifier 指定的分组函数

  • @return Collector<T, ?, ConcurrentMap<K, List>> 实现分组操作的并发无序的Collector

*/

public static <T, K> Collector<T, ?, ConcurrentMap<K, List>> groupingByConcurrent(Function<? super T, ? extends K> classifier) {

return groupingByConcurrent(classifier, ConcurrentHashMap::new, toList());

}

/**

  • 返回一个对输入的指定类型的元素执行级联分组操作的并行Collector

    • 根据分组函数进行分组操作
    • 然后根据下游收集器对关联key的指定value值执行指定的规约操作
  • @param classifier 指定的分组函数

  • @downstream 指定执行规约操作的下游收集器

  • @return Collector<T, ?, ConcurrentMap<K, D>> 实现分组操作的并发无序的Collector

*/

public static <T, K, A, D> Collector<T, ?, ConcurrentMap<K, D>> groupingByConcurrent(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream) {

return groupingByConcurrent(classifier, ConcurrentHashMap::new, downstream);

}

/**

  • 返回一个对输入的指定类型的元素执行级联分组操作的并行Collector

    • 根据分组函数进行分组操作
    • 再根据下游收集器对关联key的指定value值执行指定的规约操作
    • 然后将结果保存到指定方式实现的Map中
  • @param classifier 指定的分组函数

  • @param mapFactory 指定的Map实现

  • @downstream 指定执行规约操作的下游收集器

  • @return Collector<T, ?, ConcurrentMap<K, D>> 实现分组操作的并发无序的Collector

*/

public static <T, K, A, D, M extends ConcurrentMap<K, D>> Collector<T, ?, M> groupingByConcurrent(Function<? super T, ? extends K> classifier, Supplier mapFactory, Collector<? super T, A, D> downstream) {

Supplier downstreamSupplier = downstream.supplier();

BiConsumer<A, ? super T> downstreamAccumulator = downstream.accumulator();

BinaryOperator<ConcurrentMap<K, A>> merger = Collectors.<K, A, ConcurrentMap<K, A>>mapMerger(downstream.combiner());

@SuppressWarnings(“unchecked”)

Supplier<ConcurrentMap<K, A>> mangledFactory = (Supplier<ConcurrentMap<K, A>>) mapFactory;

BiConsumer<ConcurrentMap<K, A>, T> accumulator;

if (downstream.characteristics().contains(Collector.Characteristics.CONCURRENT)) {

accumulator = (m, t) -> {

K key = Objects.requireNonNull(classifier.apply(t), “element cannot be mapped to a null key”);

A resultContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get());

downstreamAccumulator.accept(resultContainer, t);

};

}

else {

accumulator = (m, t) -> {

K key = Objects.requireNonNull(classifier.apply(t), “element cannot be mapped to a null key”);

A resultContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get());

synchronized (resultContainer) {

downstreamAccumulator.accept(resultContainer, t);

}

};

}

if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) {

return new CollectorImpl<>(mangledFactory, accumulator, merger, CH_CONCURRENT_ID);

}

else {

@SuppressWarnings(“unchecked”)

Function<A, A> downstreamFinisher = (Function<A, A>) downstream.finisher();

Function<ConcurrentMap<K, A>, M> finisher = intermediate -> {

intermediate.replaceAll((k, v) -> downstreamFinisher.apply(v));

@SuppressWarnings(“unchecked”)

M castResult = (M) intermediate;

return castResult;

};

return new CollectorImpl<>(mangledFactory, accumulator, merger, finisher, CH_CONCURRENT_NOID);

}

}

Java Stream流中的实用操作,各种流操作的参考示例分析

joining

=======

/**

  • 返回一个根据接收元素的顺序将元素连接成一个String字符串的Collector

  • @return Collector<CharSequence, ?, String> 根据接收元素的顺序将元素连接成一个字符串的Collector

*/

public static Collector<CharSequence, ?, String> joining() {

return new CollectorImpl<CharSequence, StringBuilder, String>(

StringBuilder::new, StringBuilder::append,

(r1, r2) -> { r1.append(r2); return r1; },

StringBuilder::toString, CH_NOID);

}

/**

  • 返回一个根据接收元素的顺序将元素连接成一个String字符串并以指定的分隔符分割的Collector

  • @param delimiter 用于每个元素之间的分割符

  • @return Collector<CharSequence, ?, String> 根据接收元素的顺序将元素连接成一个字符串并以指定分割符分割的Collector

*/

public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) {

return joining(delimiter, “”, “”);

}

/**

  • 返回一个根据接收元素的顺序将元素连接成一个String字符串并以指定的分隔符分割和指定前缀和后缀的Collector

  • @param delimiter 用于每个元素之间的分割符

  • @param prefix 指定的前缀

  • @param suffix 指定的后缀

  • @return Collector<CharSequence, ?, String> 根据接收元素的顺序将元素连接成一个字符串并以指定分割符分割和指定的前缀和后缀的Collector

*/

public static Collector<CharSequence, ?, String> joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix) {

return new CollectorImpl<>(

() -> new StringJoiner(delimiter, prefix, suffix),

StringJoiner::add, StringJoiner::merge,

StringJoiner::toString, CH_NOID);

}

mapping

=======

/**

  • 在累积元素之前应用映射函数将类型为U的收集器调整为类型为T的收集器

  • mapping操作对多级规约操作最有用

  • @param mapper 映射函数

  • @param downstream 下游收集器

  • @return Collector<T, ?, R> 执行映射函数操作后的收集器

*/

public static <T, U, A, R> Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper, Collector<? super U, A, R> downstream) {

BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();

return new CollectorImpl<>(downstream.supplier(),

(r, t) -> downstreamAccumulator.accept(r, mapper.apply(t)),

downstream.combiner(), downstream.finisher(),

downstream.characteristics());

}

maxBy

=====

/**

  • 返回一个根据给定的比较器Comparator生成最大元素的Collector,使用Optional描述

  • @param comparator 指定的比较器

  • @return Collector<T, ?, Optional> 根据比较器生成最大元素的Collector

*/

public static Collector<T, ?, Optional> maxBy(Comparator<? super T> comparator) {

return reducing(BinaryOperator.maxBy(comparator));

}

minBy

=====

/**

  • 返回一个根据给定的比较器Comparator生成最小元素的Collector,使用Optional描述

  • @param comparator 指定的比较器

  • @return Collector<T, ?, Optional> 根据比较器生成最小元素的Collector

*/

public static Collector<T, ?, Optional> (Comparator<? super T> comparator) {

return reducing(BinaryOperator.minBy(comparator));

}

partitioningBy

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

/**

  • 返回一个根据指定规则分类的Collector,结果保存到Map<Boolean, List>中

  • @param predicate 指定的分类规则

  • @return Collector<T, ?, Map<Boolean, List>> 按照指定规则进行分类,并将结果保存到Map<Boolean, List>的收集器

*/

public static Collector<T, ?, Map<Boolean, List>> partitioningBy(Predicate<? super T> predicate) {

return partitioningBy(predicate, toList());

}

/**

  • 返回一个根据指定规则分类的Collector,并将结果值按照下游收集器执行规约操作,然后将规约后的结果保存到Map<Boolean, D>中

  • @param predicate 指定的分类规则

  • @param downstream 指定的执行规约操作的下游收集器

  • @return Collector<T, ?, Map<Boolean, D>> 按照指定规则进行分类,并将结果值按照下游收集器执行规约操作,然后将规约后的结果保存到Map<Boolean, D>的收集器

*/

public static <T, D, A> Collector<T, ?, Map<Boolean, D>> partitioningBy(Predicate<? super T> predicate, Collector<? super T, A, D> downstream) {

BiConsumer<A, ? super T> downstreamAccumulator = downstream.accumulator();

BiConsumer<Partition, T> accumulator = (result, t) ->

downstreamAccumulator.accept(predicate.test(t) ? result.forTrue : result.forFalse, t);

BinaryOperator op = downstream.combiner();

BinaryOperator<Partition> merger = (left, right) ->

new Partition<>(op.apply(left.forTrue, right.forTrue),

op.apply(left.forFalse, right.forFalse));

Supplier<Partition> supplier = () ->

new Partition<>(downstream.supplier().get(),

downstream.supplier().get());

if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) {

return new CollectorImpl<>(supplier, accumulator, merger, CH_ID);

}

else {

Function<Partition, Map<Boolean, D>> finisher = par ->

new Partition<>(downstream.finisher().apply(par.forTrue),

downstream.finisher().apply(par.forFalse));

return new CollectorImpl<>(supplier, accumulator, merger, finisher, CH_NOID);

}

}

reducing

========

/**

  • 返回一个按照指定的规约操作获得结果的Colletor.结果以Optional描述

  • @param op 指定的规约操作

  • @return Collector<T, ?, Optional> 按照指定的规约操作执行的结果

*/

public static Collector<T, ?, Optional> reducing(BinaryOperator op) {

class OptionalBox implements Consumer {

T value = null;

boolean present = false;

@Override

public void accept(T t) {

if (present) {

value = op.apply(value, t);

}

else {

value = t;

present = true;

}

}

}

return new CollectorImpl<T, OptionalBox, Optional>(

OptionalBox::new, OptionalBox::accept,

(a, b) -> { if (b.present) a.accept(b.value); return a; },

a -> Optional.ofNullable(a.value), CH_NOID);

}

/**

  • 返回一个使用指定标识,按照指定的规约操作获得结果的Colletor

  • @param identity 指定的标识,也是结果为空时的返回值

  • @param op 指定的规约操作

  • @return Collector<T, ?, T> 按照指定的规约操作执行的结果,当结果为空时返回指定的标识identity

*/

public static Collector<T, ?, T> reducing(T identity, BinaryOperator op) {

return new CollectorImpl<>(

boxSupplier(identity),

(a, t) -> { a[0] = op.apply(a[0], t); },

(a, b) -> { a[0] = op.apply(a[0], b[0]); return a; },

a -> a[0],

CH_NOID);

}

/**

  • 返回一个使用指定标识,按照指定的映射操作和规约操作获得结果的Colletor

  • @param identity 指定的标识,也是结果为空时的返回值

  • @param mapper 指定的映射操作

  • @param op 指定的规约操作

  • @return Collector<T, ?, Optional> 按照指定的映射操作和规约操作执行的结果,当结果为空时返回指定的标识identity

*/

public static <T, U> Collector<T, ?, U> reducing(U identity, Function<? super T, ? extends U> mapper, BinaryOperator op) {

return new CollectorImpl<>(

boxSupplier(identity),

(a, t) -> { a[0] = op.apply(a[0], mapper.apply(t)); },

(a, b) -> { a[0] = op.apply(a[0], b[0]); return a; },

a -> a[0], CH_NOID);

}

summarizingDouble

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

/**

  • 返回一个使用double类型映射每一个输入元素并返回结果值汇总信息的Collector

  • @param mapper 指定的映射操作

  • @return Collector<T, ?, DoubleSummaryStatistics> 汇总信息的规约操作

*/

public static Collector<T, ?, DoubleSummaryStatistics> summarizingDouble(ToDoubleFunction<? super T> mapper) {

return new CollectorImpl<T, DoubleSummaryStatistics, DoubleSummaryStatistics>(

DoubleSummaryStatistics::new,

(r, t) -> r.accept(mapper.applyAsDouble(t)),

(l, r) -> { l.combine®; return l; }, CH_ID);

}

summarizingInt

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

/**

  • 返回一个使用int类型映射每一个输入元素并返回结果值汇总信息的Collector

  • @param mapper 指定的映射操作

  • @return Collector<T, ?, IntSummaryStatistics> 汇总信息的规约操作

*/

public static Collector<T, ?, IntSummaryStatistics> summarizingInt(ToIntFunction<? super T> mapper) {

return new CollectorImpl<T, IntSummaryStatistics, IntSummaryStatistics>(

IntSummaryStatistics::new,

(r, t) -> r.accept(mapper.applyAsInt(t)),

(l, r) -> { l.combine®; return l; }, CH_ID);

}

summarizingLong

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

/**

  • 返回一个使用long类型映射每一个输入元素并返回结果值汇总信息的Collector

  • @param mapper 指定的映射操作

  • @return Collector<T, ?, IntSummaryStatistics> 汇总信息的规约操作

*/

public static Collector<T, ?, LongSummaryStatistics> summarizingLong(ToLongFunction<? super T> mapper) {

return new CollectorImpl<T, LongSummaryStatistics, LongSummaryStatistics>(

LongSummaryStatistics::new,

(r, t) -> r.accept(mapper.applyAsLong(t)),

(l, r) -> { l.combine®; return l; }, CH_ID);

}

Java Stream流中的实用操作,各种流操作的参考示例分析

summingDouble

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

/**

  • 返回一个使用double类型映射每一个输入元素并返回元素之和的Collector

  • 如果不存在元素则返回0

  • @param mapper 指定的映射操作

  • @return Collector<T, ?, Double> 执行元素求和规约操作的Collector

*/

public static Collector<T, ?, Double> summingDouble(ToDoubleFunction<? super T> mapper) {

/*

  • 在为收集操作分配的数组中:

  • 索引0 - 运行和的高位

  • 索引1 - 补偿计算的和的低阶位求和

  • 索引2 - 当存在无穷大结果和时正确的符号

*/

return new CollectorImpl<>(

() -> new double[3],

(a, t) -> { double val = mapper.applyAsDouble(t);

sumWithCompensation(a, val);

a[2] += val;},

(a, b) -> { sumWithCompensation(a, b[0]);

a[2] += b[2];

return sumWithCompensation(a, b[1]); },

a -> computeFinalSum(a),

CH_NOID);

}

summingInt

==========

/**

  • 返回一个使用int类型映射每一个输入元素并返回元素之和的Collector

  • 如果不存在元素则返回0

  • @param mapper 指定的映射操作

  • @return Collector<T, ?, Integer> 执行元素求和规约操作的Collector

*/

public static Collector<T, ?, Integer> summingInt(ToIntFunction<? super T> mapper) {

return new CollectorImpl<>(

() -> new int[1],

(a, t) -> { a[0] += mapper.applyAsInt(t); },

(a, b) -> { a[0] += b[0]; return a; },

a -> a[0], CH_NOID);

}

summingLong

===========

/**

  • 返回一个使用long类型映射每一个输入元素并返回元素之和的Collector

  • 如果不存在元素则返回0

  • @param mapper 指定的映射操作

  • @return Collector<T, ?, Integer> 执行元素求和规约操作的Collector

*/

public static Collector<T, ?, Long> summingLong(ToLongFunction<? super T> mapper) {

return new CollectorImpl<>(

() -> new long[1],

(a, t) -> { a[0] += mapper.applyAsLong(t); },

(a, b) -> { a[0] += b[0]; return a; },

a -> a[0], CH_NOID);

}

toCollection

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

/**

  • 返回一个将接收的元素按照接收顺序放入生成的集合的Collector

  • @param collectionFactory 指定的生成的集合

  • @return Collector<T, ?, C> 将接收的元素按照接收顺序生成集合的Collector

*/

public static <T, C extends Collection> Collector<T, ?, C> toCollection(Supplier collectionFactory) {

return new CollectorImpl<>(collectionFactory, Collection::add,

(r1, r2) -> { r1.addAll(r2); return r1; },

CH_ID);

}

toConcurrentMap

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

/**

  • 返回一个将接收的元素放入并发的Map中的并发Collector,其中Map的key和value按照指定的映射函数生成

  • @param keyMapper 键的映射器

  • @param valueMapper 值的映射器

  • @return Collector<T, ?, ConcurrentMap<K,U>> 将接收的元素按照放入并发的Map中的并发无序Collector

*/

public static <T, K, U> Collector<T, ?, ConcurrentMap<K,U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) {

return new CollectorImpl<>(ConcurrentHashMap::new,

uniqKeysMapAccumulator(keyMapper, valueMapper),

uniqKeysMapMerger(),

CH_CONCURRENT_ID);

}

/**

  • 返回一个将接收的元素放入并发的Map中的并发Collector,其中Map的key和value按照指定的映射函数生成

  • 如果存在重复的键值,则会应用指定的合并函数

  • @param keyMapper 键的映射器

  • @param valueMapper 值的映射器

  • @param mergeFunction 指定的合并函数

  • @return Collector<T, ?, ConcurrentMap<K,U>> 将接收的元素按照放入并发的Map中的并发Collector

*/

public static <T, K, U> Collector<T, ?, ConcurrentMap<K,U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator mergeFunction) {

return toConcurrentMap(keyMapper, valueMapper, mergeFunction, ConcurrentHashMap::new);

}

/**

  • 返回一个将接收的元素放入指定方式实现的并发Map中的并发Collector,其中Map的key和value按照指定的映射函数生成

  • 如果存在重复的键值,则会应用指定的合并函数

  • @param keyMapper 键的映射器

  • @param valueMapper 值的映射器

  • @param mergeFunction 指定的合并函数

  • @param mapFactory 指定的Map实现方式

  • @return Collector<T, ?, M> 将接收的元素按照放入指定方式实现的并发Map中的并发Collector

*/

public static <T, K, U, M extends ConcurrentMap<K, U>> Collector<T, ?, M> toConcurrentMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,BinaryOperator mergeFunction,Supplier mapFactory) {

BiConsumer<M, T> accumulator

= (map, element) -> map.merge(keyMapper.apply(element),

valueMapper.apply(element), mergeFunction);

return new CollectorImpl<>(mapFactory, accumulator, mapMerger(mergeFunction), CH_CONCURRENT_ID);

}

toList

======

/**

  • 返回一个将接收的元素按照接收的顺序放入List中的收集器Collector

  • @return Collector<T, ?, List> 包含输入元素的List类型的收集器Collector

*/

public static Collector<T, ?, List> toList() {

return new CollectorImpl<>((Supplier<List>) ArrayList::new, List::add,

(left, right) -> { left.addAll(right); return left; },

CH_ID);

}

toMap

=====

/**

  • 返回一个将接收的元素放入Map中的Collector,其中Map的key和value按照指定的映射函数生成

  • @param keyMapper 键映射函数

  • @param valueMapper 值映射函数

  • @return Collector<T, ?, Map<K,U>> 将接收的元素放入Map中的Collector

*/

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) {

return new CollectorImpl<>(HashMap::new,

uniqKeysMapAccumulator(keyMapper, valueMapper),

uniqKeysMapMerger(),

CH_ID);

}

/**

  • 返回一个将接收的元素放入Map中的Collector,其中Map的key和value按照指定的映射函数生成

  • 如键重复,则使用指定的合并函数合并

  • @param keyMapper 键映射函数

  • @param valueMapper 值映射函数

  • @param mergeFunction 指定的合并函数

  • @return Collector<T, ?, Map<K,U>> 将接收的元素放入Map中的Collector

*/

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator mergeFunction) {

return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);

}

/**

  • 返回一个将接收的元素放入指定实现方式的Map中的Collector,其中Map的key和value按照指定的映射函数生成

  • 如键重复,则使用指定的合并函数合并

  • @param keyMapper 键映射函数

  • @param valueMapper 值映射函数

  • @param mergeFunction 指定的合并函数

  • @param mapFactory 指定的Map实现方式

  • @return Collector<T, ?, Map<K,U>> 将接收的元素放入指定实现方式的Map中的Collector

*/

public static <T, K, U, M extends Map<K, U>> <T, ?, M> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator mergeFunction, mapFactory) {

BiConsumer<M, T> accumulator

= (map, element) -> map.merge(keyMapper.apply(element),

valueMapper.apply(element), mergeFunction);

return new CollectorImpl<>(mapFactory, accumulator, mapMerger(mergeFunction), CH_ID);

}

toSet

=====

/**

  • 返回一个将接收的元素放入Set中的收集器Collector

  • @return Collector<T, ?, Set> 将接收的元素放入Set中的Collector

*/

public static Collector<T, ?, Set> toSet() {

return new CollectorImpl<>((Supplier<Set>) HashSet::new, Set::add,

(left, right) -> {

if (left.size() < right.size()) {

right.addAll(left); return right;

} else {

left.addAll(right); return left;

}

},

CH_UNORDERED_ID);

}

统计

==

  • 产生统计结果的收集器,主要用于int,double,long等类型

List numbers = Arrays.asList(3, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println(“列表中最大的数:” + stats.getMax());

最后

Java架构进阶面试及知识点文档笔记

这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理

image

Java分布式高级面试问题解析文档

其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!

image

互联网Java程序员面试必备问题解析及文档学习笔记

image

Java架构进阶视频解析合集

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

==

/**

  • 返回一个将接收的元素放入Set中的收集器Collector

  • @return Collector<T, ?, Set> 将接收的元素放入Set中的Collector

*/

public static Collector<T, ?, Set> toSet() {

return new CollectorImpl<>((Supplier<Set>) HashSet::new, Set::add,

(left, right) -> {

if (left.size() < right.size()) {

right.addAll(left); return right;

} else {

left.addAll(right); return left;

}

},

CH_UNORDERED_ID);

}

统计

==

  • 产生统计结果的收集器,主要用于int,double,long等类型

List numbers = Arrays.asList(3, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println(“列表中最大的数:” + stats.getMax());

最后

Java架构进阶面试及知识点文档笔记

这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理

[外链图片转存中…(img-fW1foDbW-1713605903025)]

Java分布式高级面试问题解析文档

其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!

[外链图片转存中…(img-125O1NVh-1713605903026)]

互联网Java程序员面试必备问题解析及文档学习笔记

[外链图片转存中…(img-znoNJVq2-1713605903026)]

Java架构进阶视频解析合集

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-g0FCd7H6-1713605903027)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Test软件:Keysight二次开发_(3).安装与配置开发环境 在开始进行Keysight软件的二次开发之前,首先需要确保您的开发环境已经正确安装和配置。本节将详细介绍如何安装和配置必要的开发工具和依赖项,以便您能够顺利进行开发工作。 阅读详情

相关推荐

UWB定位进阶:如何利用DW1000的CIR数据做NLOS信号识别?

本文深入探讨了如何利用DW1000芯片的信道脉冲响应(CIR)数据进行非视距(NLOS)信号识别,以提升UWB定位精度。通过分析CIR数据的核心价值、预处理方法、特征提取技术以及机器学习模型构建,为研究人员和工程师提供了实用的解决方案,帮助克服室内定位中的NLOS挑战。

weixin_28729205的博客 474

Java 8中的Stream基本介绍

Java 8中的StreamStream基本概念生成流forEachmapfilter Stream基本概念 Stream流是来自数据源的元素队列并支持聚合操作: 元素: 是特定类型的对象,是数据源形成的一个队列.Java中的Stream不会存储元素,而是按需计算 数据源: Stream流数据的来源.可以是集合,数组,I/O Channel,产生器Generator等 聚合操作: 类似SQL语句的一系列操作,比如filter,map,reduce,match和sorted等 Stream操作的两个基

攻城狮Chova的博客 887

Vivado 2021.1 实战:手把手教你用IEEE1735 V2加密你的Verilog源码(附完整TCL命令)

本文详细介绍了在Vivado 2021.1中使用IEEE1735 V2标准加密Verilog源码的全流程,包括许可证申请、密钥文件配置、TCL命令执行及加密后验证。通过实战步骤和完整TCL命令,帮助开发者有效保护FPGA设计知识产权,确保核心算法安全。

weixin_42706667的博客 190

Java Stream对象并行处理方法parallel()

通常情况下,Stream API上的大多数操作都是顺序执行的,也就是说操作一个元素,然后再操作下一个元素。需要注意的是,并行计算不一定总是比串行计算更快,因为创建线程以及进行线程间通信的开销也是很大的。同时,在使用并行流时,需要确保Stream的操作是无状态或者线程安全的,否则可能会导致意外的结果。具体来说,Stream的parallel()方法可以将一个顺序流转换为一个并行流。使用并行流时,不需要手动设置线程数,因为Java会自动根据CPU核心数瓶颈以及程序的处理需求设置最优的线程数。

Ascend1977的博客 9631

IEC103协议实战指南:报文解析与传输优化策略

本文深入解析IEC103协议在电力自动化系统中的核心应用,重点拆解其固定帧与可变帧两种报文格式,并详细阐述了主从问答与非平衡传输机制。文章结合实战经验,针对报文解析中的常见问题(如字节序、超时重发)提供了解决方案,并探讨了传输层优化策略,旨在帮助工程师实现更可靠、高效的通信链路。

r2s3t4的博客 541

影刀RPA进阶:Excel多条件筛选与数据提取实战

本文详细介绍了如何利用影刀RPA实现Excel多条件筛选与数据提取的自动化。通过拆解文本、数值、日期及颜色筛选等核心指令,并结合实战案例,指导用户构建稳健的销售数据提取机器人,从而高效处理复杂数据报表,提升工作效率。

onion的博客 528

stream 流 and 函数式编程使用经验

stream流 and 函数式编程(无讲解)

IT_Octopus的博客 474

S4-FPGA-K7板级原理图硬件实战

xilinx K7板级硬件实战

weixin_66510961的博客 6149

使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

对于一个List<Map<String, Object>>类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。

MidYear的博客 2万+

drm 之modes

#define _GNU_SOURCE #include <errno.h> #include <fcntl.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <time.h&...

u012794472的专栏 3716

MacBook用户必看:用Homebrew一键搞定frp内网穿透(含阿里云配置模板)

本文为MacBook用户提供基于Homebrew的frp内网穿透实战指南,详细介绍了从环境准备到阿里云服务器配置的全过程。通过Homebrew一键安装frp客户端,结合阿里云配置模板,实现高效稳定的内网穿透,适用于远程开发、IoT设备调试等多种场景。

weixin_28692817的博客 321

基础篇:JAVA.Stream函数,优雅的数据流操作

前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看。java提供了Stream的概念,它可以让我们把集合数据当做一个个元素在处理,并且提供多线程模式 流的创建 流的各种数据操作 流的终止操作 流的聚合处理 并发流和CompletableFuture的配合使用

潜行前行的专栏 3030

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

努力让自己发光,对的人才能迎着光而来 34万+

Java Stream流中的实用操作,各种流操作的参考示例分析(1)

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!部分截图:操作后的收集器*/super T,?自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

X7gUWZnYP的博客 990

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java stream优雅的操作流,stream的常见操作

这里写目录标题ListList<String> 转 List<Integer> 如果 strList 中全是数字字符串,可通过如下转换为 integerList List<String> strList = new ArrayList<>(Arrays.asList("7","8","9")); List<Integer> integerList = strList.stream().map(v -> Inte

西凉的悲伤博客 7659

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

玩转Java8 Stream流

Java8中Stream流总结 因为在工作后,发现项目代码里经常会出现Stream流以及和lambda表达式联合使用。但之前对于这块的学习有点一知半解,所以花了几天空闲时间将这些知识总结一下。 一、概述 **(参考百度)**Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Str

weixin_41938314的博客 9595

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java流操作:Stream操作与详解

目录 Stream集合流操作 Stream 和 parallelStream 注意事项 操作元素 说明 实践 测试实体类:Test Stream集合流操作 Java 8 API添加了一个新的抽象称为流 Stream ,可以让你以一种声明的方式处理数据; Stream 是一个来自 数据源 的元素队列并支持 聚合 操作,可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码; Stream 和 parallelStream Stream:串行流,单线程,线程.

alan_liuyue的博客 4864

Java Stream 最全操作用法合集

Java 8 引入了Stream流的操作,让我们在开发的过程中感受到了很多的便利,小宋我也花时间总结了下关于Stream的堪称最全的使用方法,话不多说,直接放大招。

u012062957的博客 6562

Java Stream 流的合并操作

1. 前言Java Stream Api[1] 提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为流进行操作。今天我们来看看如何合并 Stream 流。2. Stre...

码农小胖哥 1万+

【java基础】Stream流的各种操作

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。与集合相比,流提供了一种可以让我们在更高概念级别上指定计算任务的数据视图注意:学习Stream必须要十分清晰的了解lamdba表达式,如果lambda不清楚,请参考一篇文章彻底搞懂lambda表达式。

秃头披风侠的博客 3634

Java8 Stream流操作

Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利。那么什么是Stream?Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。Stream可以由数组或集合创建,对流的操作分为两种:1. 中间操作,每次返回一个新的流,可以有多个。2. 终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。...

qq_39164234的博客 3868

Java中的Stream流

reduce的作用是把stream中的元素组合起来,通过传入一个初始值,按照规定的计算方式依次将流中的元素和初始值进行计算,计算结果再和后面的元素进行计算,其内部计算流程如下所示。:可以对流中的元素进行条件过滤,符合过滤条件的才能继续留在流中。只能把一个对象转换成另一个对象来作为流中的元素,而。例子一:打印所有书籍的名称,要求对重复元素进行去重。:对流中的所有元素进行计算,并将计算结果进行返回。:可以将流中的元素进行计算或者转换(一对一)。:可以将流中的元素进行计算或者转换(一对多)。

CarleH的博客 831
上一篇: Java Stream函数式编程第三篇:管道流结果处理,2024年最新附Java面经
下一篇: Java stream流用法总结,java面试八股文汇总
普通网友
博客等级 码龄5年 3419粉丝 477原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值